我有一个需要运行一个while循环5分钟。 我寻找计时器API,但我找不到这样做。 任何人都可以为此提供代码snipet。
谢谢运行循环5分钟
运行循环5分钟
回答
最简单的方法是检查每次迭代已经过了多少时间。例如:
final long NANOSEC_PER_SEC = 1000l*1000*1000;
long startTime = System.nanoTime();
while ((System.nanoTime()-startTime)< 5*60*NANOSEC_PER_SEC){
// do stuff
}
这将运行循环,直到超过5分钟过去。
注:
- 本次循环总是会完成,所以在实践中,它会永远为位运行超过5分钟。
- 对于此应用程序,
System.nanoTime()
比System.currentTimeMillis()
更适合,因为如果计算机的系统时钟已调整,后者将会发生变化,从而导致计算失败。 感谢Shloim指出这一点。
如果用户在循环运行时调整自己的时钟,则循环将不会运行1分钟。它可能会运行数月或数年。这是因为System.currentTimeMillis()从1970/01/01-00:00:00返回msecs的数量。你需要一个单调的时间计数器,比如'System.nanoTicks()' – Shloim 2016-01-12 12:36:36
因为你在谈论定时器API,我猜你以后是延迟而不是“循环运行5分钟”。如果是这种情况,你可以使用类似Thread.sleep(..)的东西,这样可以让CPU做更多有用的东西来忙等待。或者至少节省一些能源和地球。
是的,对于简单的延迟这是正确的答案。这个问题有点不清楚...... – sleske 2010-09-23 21:52:04
此循环将运行5分钟。它不会受到计算机日期/时间变化(用户或NTP)的影响。应避免
long endTime = System.nanoTicks() + TimeUnit.NANOSECONDS.convert(5L, TimeUnit.MINUTES);
while (System.nanoTicks() < endTime){
// do whatever
}
像System.currentTimeMillis()
其他方法,因为它们依赖于计算机的日期/时间。
http://stackoverflow.com/questions/2550536/java-loop-for-a-certain-duration – 2010-09-22 10:19:00
谢谢我正在寻找。 – sjain 2010-09-22 10:23:18