2010-09-22 110 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()其他方法,因爲它們依賴於計算機的日期/時間。