簡體   English   中英

反復調用System.currentTimeMillis()/ nanoTime()

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM