[英]Repeatedly Calling System.currentTimeMillis()/nanoTime()
我正在嘗試創建一個線程,該線程可以跟蹤某個事件是否已經發生/正在發生的時間。 我希望能夠在線程之外使用經過的時間,例如:
if(theChecker.elapsedTime > 5)
doThis();
我基本上擁有的代碼如下所示:
public class Checker extends Thread {
public int startTime, elapsedTime;
@Override
public void run() {
while(true) {
if(check()) {
if(startTime == 0)
startTime = System.currentTimeMillis();
elapsedTime = System.currentTimeMillis() - startTime;
}
else {
startTime = 0;
elapsedTime = 0;
}
}
}
private boolean check() {
return isSomethingHappening();
}
}
您可能會猜到,這導致了可怕的性能問題。 在計算出elapsedTime之后,我已經使線程休眠250 ms,但是性能仍然存在問題。
有沒有更高效的方法可以解決此問題? 我很確定這與while循環不斷激發而被遺忘有關,再加上System.currentTimeMillis()並不是完全免費的調用,這在內存方面是有效的。
感謝您的任何答復。
建議不要使用觀察者模式來進行正在進行的事件的線程輪詢。 這樣,您可以讓您的檢查器訂閱您感興趣的事件。當事件觸發時,您可以將有關事件的一些信息(包括時間戳)打包到隊列中,然后通知報告線程該隊列已改性。 然后,報告線程可以從隊列中彈出並執行您在上面的代碼中匯總的工作。
不要存儲elapsedTime
。 只需在需要時進行計算即可。
public long getElapsedTime() {
if (isSomethingHappening())
return System.currentTimeMillis() - startTime;
return 0;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.