2010-09-22 87 views
0

我有一个需要运行一个while循环5分钟。 我寻找计时器API,但我找不到这样做。 任何人都可以为此提供代码snipet。
谢谢运行循环5分钟

+2

http://stackoverflow.com/questions/2550536/java-loop-for-a-certain-duration – 2010-09-22 10:19:00

+0

谢谢我正在寻找。 – sjain 2010-09-22 10:23:18

回答

11

最简单的方法是检查每次迭代已经过了多少时间。例如:

final long NANOSEC_PER_SEC = 1000l*1000*1000; 

long startTime = System.nanoTime(); 
while ((System.nanoTime()-startTime)< 5*60*NANOSEC_PER_SEC){ 
    // do stuff 
} 

这将运行循环,直到超过5分钟过去。

注:

  1. 本次循环总是会完成,所以在实践中,它会永远为位运行超过5分钟。
  2. 对于此应用程序,System.nanoTime()System.currentTimeMillis()更适合,因为如果计算机的系统时钟已调整,后者将会发生变化,从而导致计算失败。 感谢Shloim指出这一点。
+2

如果用户在循环运行时调整自己的时钟,则循环将不会运行1分钟。它可能会运行数月或数年。这是因为System.currentTimeMillis()从1970/01/01-00:00:00返回msecs的数量。你需要一个单调的时间计数器,比如'System.nanoTicks()' – Shloim 2016-01-12 12:36:36

1

因为你在谈论定时器API,我猜你以后是延迟而不是“循环运行5分钟”。如果是这种情况,你可以使用类似Thread.sleep(..)的东西,这样可以让CPU做更多有用的东西来忙等待。或者至少节省一些能源和地球。

+0

是的,对于简单的延迟这是正确的答案。这个问题有点不清楚...... – sleske 2010-09-23 21:52:04

2

此循环将运行5分钟。它不会受到计算机日期/时间变化(用户或NTP)的影响。应避免

long endTime = System.nanoTicks() + TimeUnit.NANOSECONDS.convert(5L, TimeUnit.MINUTES); 
while (System.nanoTicks() < endTime){ 
    // do whatever 
} 

System.currentTimeMillis()其他方法,因为它们依赖于计算机的日期/时间。