在类被销毁后重新启动TimeTask线程

时间:2016-08-30 13:50:19

标签: java multithreading timertask

我正在使用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()没有破坏计时器线程,所以当我创建一个新的计时器时,我得到两个线程再次运行。我该如何解决这个问题?

1 个答案:

答案 0 :(得分:0)

根据oracle doc

  

如果在调用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(),则只返回并且不执行任何操作。否则,您可以启动该线程。