2016-08-30 6 views
0

Java EEでTimeTaskを使用してカウントダウンタイマーを作成しています。ボタンのクリック(開始/停止)にイベントが添付されます。クラスを破棄した後の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(); 
    } 
} 

レイアウトに配置されたラベルにタイマー値が表示されています。

これは問題なく動作しています。ページをリロードすると問題が発生します。私は既に開始されているスレッドを取り返したいのではなく、クラスが新しいスレッドを作成していて、クロックが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()はタイマースレッドを破棄しないため、新しいタイマーを作成すると2つのスレッドが再度実行されます。これをどうすれば解決できますか?

答えて

0

このスレッドは、待機の呼び出しでブロックされている場合)(oracle doc

によれば、(長い)待つ、またはオブジェクトクラスの、または結合の(長い、INT)の方法を待ちます(long)、join(long)、sleep(long)、sleep(long、int)のいずれかのメソッドを呼び出すと、その割り込みステータスはクリアされ、InterruptedExceptionが返されます。

java.util.Timerについては、mainloop()の方法でqueue.wait()を使用します。私はあなたがちょうどInterruptedExceptionをキャッチしたと思うが、何もしなかった。だからthreadTimerは殺されなかった。

イベントリスナーでthreadTimerをチェックすることをお勧めします。 nullでなくisAlive()の場合は、何も返さずにそのまま返します。そうしないと、スレッドを起動できません。

+0

My Thread.interrupt()がInterruptedException例外をスローしていない... – aseolin

関連する問題