在 Java 中运行代码 x 秒?

新手上路,请多包涵

我想编写一个将迭代 15 秒的 java while 循环。我想这样做的一种方法是存储当前系统时间 + 15 秒,然后将其与 while 循环签名中的当前时间进行比较。

有没有更好的办法?

原文由 Danny King 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 648
2 个回答

这个的设计取决于你想在 15 秒内做什么。两种最合理的情况是“每隔 X 执行此操作 15 秒”或“等待 X 发生或 15 秒以先到者为准”,这将导致截然不同的代码。

只是等待

线程.睡眠(15000)

这不会迭代,但是如果您想在 15 秒内什么都不做,效率会高得多(它在什么都不做时浪费的 CPU 更少)。

重复一些代码 15 秒

如果您真的想循环 15 秒,那么您的解决方案就可以了,只要您的代码不会花费太长时间。就像是:

 long t= System.currentTimeMillis();
long end = t+15000;
while(System.currentTimeMillis() < end) {
  // do something
  // pause to avoid churning
  Thread.sleep( xxx );
}

等待 15 秒或其他条件

如果您希望您的代码在刚好 15 秒后被中断,无论它在做什么,您都需要一个多线程解决方案。查看 java.util.concurrent 以获得许多有用的对象。大多数锁定方法(如 wait() )都有超时参数。 信号量 可能正是您所需要的。

原文由 Nick Fortescue 发布,翻译遵循 CC BY-SA 4.0 许可协议

正如其他海报已经提到的,如果您只想让线程暂停一段时间,请使用 Thread.sleep()

如果你想让线程做某事,但又想让它在一段时间后停止,可以使用类似的东西:

 class Foo implements Runnable {
    private volatile boolean killed = false;

    public void run() {
        while (!killed) {
            try { doOnce(); } catch (InterruptedException ex) { killed = true; }
        }
    }

    public void kill() { killed = true; }
    private void doOnce() throws InterruptedException { /* .. */ }
}

从主线程执行:

 Foo foo = new Foo();
Thread thread = new Thread(foo);
thread.start();

/* when you want to stop it */
foo.kill();
thread.interrupt();

原文由 Binil Thomas 发布,翻译遵循 CC BY-SA 2.5 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题