【问题标题】:How to stop and restart a loop inside a thread?如何停止和重新启动线程内的循环?
【发布时间】:2014-02-28 06:00:39
【问题描述】:

我正在使用 Swing 处理 Java。我正在开发一个绘图应用程序。只要布尔变量设置为true,它就有一个不断运行的不断更新循环。循环位于线程内。

它工作正常,但现在我希望循环仅在特定时间运行(仅在按下鼠标时),否则不运行。 (因此不会白白浪费内存)。

要停止循环,我可以简单地将变量设置为false,这样while 循环就会退出。但我的问题是,停止循环后如何重新启动循环?将该变量设置回true 不会重新启动循环,因为程序已经在该循环之外(我正确吗?)。如果是这样,有什么好的方法可以做到这一点?

我的循环:

public void run(){

    int TICKS_PER_SECOND = 50;
    int SKIP_TICKS = 1000 / TICKS_PER_SECOND;
    int MAX_FRAMESKIP = 10;

    long next_game_tick = System.currentTimeMillis();
    int loops;

    boolean app_is_running = true;

    while( app_is_running ) {

        loops = 0;
        while( System.currentTimeMillis() > next_game_tick && loops < MAX_FRAMESKIP) {

            update();
            catch (AWTException e) { e.printStackTrace(); }

            next_game_tick += SKIP_TICKS;
            loops++;
        }

        repaint();
    }

}

【问题讨论】:

  • @NickWiggill 没问题,更新了问题。我正在使用 Java 和 Swing。
  • 哈哈没问题,刚看到你的回复我就把评论删了。

标签: java multithreading swing


【解决方案1】:

将您的循环移至它自己的方法。然后,当您需要停止时,您可以从该方法返回。当您想返回时,只需再次调用该方法即可。

【讨论】:

    【解决方案2】:

    如果需要,您可以让鼠标单击处理程序生成线程吗?使用变量来跟踪线程何时运行,这样它就知道不会重生。完成后只需退出线程。这应该在不需要任务时最大限度地减少资源。

    【讨论】:

      【解决方案3】:

      使用递归。在自身内部调用循环。或者在自身内部调用方法。

      或者您可以将其编码到一个方法中,以便您可以根据需要调用该循环。

      【讨论】:

      • 这里的递归可能会浪费栈。
      猜你喜欢
      • 1970-01-01
      • 2018-01-04
      • 1970-01-01
      • 2023-03-30
      • 2020-03-25
      • 2010-12-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多