我正在尝试创建一个线程来跟踪某个事件发生/正在发生的时间。我希望能够使用线程之外的经过时间,例如:
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()不完全是一个免费调用,内存明智。
感谢您的回复。
答案 0 :(得分:5)
我建议您使用Observer模式,而不是对正在进行的事件进行线程轮询。有了这个,您可以让您的检查器订阅您感兴趣的事件。当事件触发时,您可以在队列中打包有关事件(包括时间戳)的一些信息,然后通知报告线程队列已经改性。然后,报告线程可以从队列中弹出,并执行您在上面的代码中放在一起的工作。
答案 1 :(得分:2)
不要存储elapsedTime
。只需在需要时计算它。
public long getElapsedTime() {
if (isSomethingHappening())
return System.currentTimeMillis() - startTime;
return 0;
}