Java循环一段时间

新手上路,请多包涵

有没有一种方法可以轻松地在一定时间内执行 for 循环? (不使用 System.currentTimeMillis() 自己测量时间?)

即我想在 Java 中做这样的事情:

 int x = 0;
for( 2 minutes )  {
   System.out.println(x++);
}

谢谢

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

阅读 505
2 个回答

不,没有内置的结构可以做到这一点。

我想指出,您不应该使用 System.currentTimeMillis() 来执行或延迟指定时间段内的任务。而是使用 System.nanoTime()。前一种方法在 Windows 中不准确,而后一种方法无论操作系统如何都是准确的。您可以使用 TimeUnit 枚举轻松地在以毫秒为单位的时间或任何其他时间单位之间切换到以纳秒为单位的时间。

 for (long stop=System.nanoTime()+TimeUnit.SECONDS.toNanos(2);stop>System.nanoTime();) {
  /*
   * Hammer the JVM with junk
   */
}

原文由 Tim Bender 发布,翻译遵循 CC BY-SA 3.0 许可协议

我认为这就是你想要的:

 private final Thread thisThread = Thread.current();
private final int timeToRun = 120000; // 2 minutes;

new Thread(new Runnable() {
    public void run() {
        sleep(timeToRun);
        thisThread.interrupt();
    }
}).start();

while (!Thread.interrupted()) {
    // do something interesting.
}

这避免了重复系统调用来获取系统时钟值(这可能相当昂贵)并轮询当前线程的 interrupted 标志(便宜得多)。

编辑

实际上没有比轮询时钟或轮询标志更 安全 的替代方法。理论上,您可以修改上述片段以调用 已弃用Thread.stop() 方法而不是 Thread.interrupt()

(我 建议使用 Thread.stop() 和朋友。它们有缺陷,使用起来很危险。我只是将其作为 理论上 的替代方案。)

编辑 2

只是要指出使用 Thread.interrupt() 比设置共享标志有优势:

  • Thread.interrupt() 将导致某些阻塞 I/O 和同步方法解除阻塞并抛出已检查的异常。更新共享标志不会这样做。

  • 一些第三方库还检查中断标志以查看它们是否应该停止当前正在做的事情。

  • 如果您的循环涉及调用其他方法等, Thread.interrupt() 意味着您无需担心这些方法可以访问标志……如果他们需要的话。

编辑 3

只是补充说 sleep(N) 不能保证恰好在 N 毫秒后唤醒睡眠线程。但在正常情况下,它会相当接近。

原文由 Stephen C 发布,翻译遵循 CC BY-SA 3.0 许可协议

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