反复调用System.currentTimeMillis()/ nanoTime()

时间:2010-11-01 02:30:38

标签: java

我正在尝试创建一个线程来跟踪某个事件发生/正在发生的时间。我希望能够使用线程之外的经过时间,例如:

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毫秒,但性能仍然存在问题。

还有更高效的方法吗?我很确定这与while循环不断触发遗忘有关,再加上System.currentTimeMillis()不完全是一个免费调用,内存明智。

感谢您的回复。

2 个答案:

答案 0 :(得分:5)

我建议您使用Observer模式,而不是对正在进行的事件进行线程轮询。有了这个,您可以让您的检查器订阅您感兴趣的事件。当事件触发时,您可以在队列中打包有关事件(包括时间戳)的一些信息,然后通知报告线程队列已经改性。然后,报告线程可以从队列中弹出,并执行您在上面的代码中放在一起的工作。

答案 1 :(得分:2)

不要存储elapsedTime。只需在需要时计算它。

public long getElapsedTime() {
    if (isSomethingHappening())
        return System.currentTimeMillis() - startTime;

    return 0;
}