我正在使用Java EE中的TimeTask开发一个倒数计时器。该事件附加到按钮单击(开始/停止):
this.timer = new Timer("taskname");
this.timer.scheduleAtFixedRate(new TimerTask() {
public void run() {
if (remainTime <= 0) {
stopTimer();
} else {
remainTime--;
}
saveCurrentTimeOnDb(remainTime);
}
}, 1000, 1000);
private void stopTimer() {
if (timer != null) {
this.timer.cancel();
this.timer.purge();
}
}
计时器值显示在布局上的标签上。
这工作正常。重新加载页面时出现问题。我想重新获得已经启动的线程,而Class正在创建一个新线程,并且时钟运行速度快2倍。
我试着这样做:
Thread threadTimer = getThreadByName("taskname");
if (threadTimer != null) { // thread exists
threadTimer.interrupt(); // destroying it
currentTime = getCurrentTimeFromDb();
createNewTimer(currentTime); // creates a new thread
}
时钟计时器每秒都保存在DB上(这是系统要求),所以我可以从中获取当前时间。我正在尝试取消旧线程并使用我已有的时钟时间创建一个新线程。
问题是:threadTimer.interrupt()没有破坏计时器线程,所以当我创建一个新的计时器时,我得到两个线程再次运行。我该如何解决这个问题?
答案 0 :(得分:0)
如果在调用Object类的wait(),wait(long)或wait(long,int)方法,或者join(),join(long),join(long)时阻塞了这个线程,int),sleep(long)或sleep(long,int),这个类的方法,然后它的中断状态将被清除,它将收到InterruptedException。
对于java.util.Timer
,它确实在queue.wait()
方法中使用了mainloop()
。我猜你刚抓到InterruptedException
但没有做任何事。所以threadTimer
没有被杀死。
我建议你在事件监听器中检查threadTimer
。如果它不为空且isAlive()
,则只返回并且不执行任何操作。否则,您可以启动该线程。