2016-08-30 5 views
0

Я разрабатываю таймер обратного отсчета с TimeTask в Java EE. Событие прикрепляется к нажатию кнопки (старт/стоп):Retake 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(); 
    } 
} 

значение таймера показывает на этикетке, размещенной на макете.

Это работает нормально. Проблема возникает при перезагрузке страницы. Я хочу вернуть поток, который уже запущен, вместо этого класс создает новый поток, а часы работают 2x быстро.

Я пытался сделать что-то вроде этого:

Thread threadTimer = getThreadByName("taskname"); 

if (threadTimer != null) { // thread exists 
    threadTimer.interrupt(); // destroying it 

    currentTime = getCurrentTimeFromDb(); 

    createNewTimer(currentTime); // creates a new thread 
} 

Таймер часов сохраняется на БД каждую секунду (это требование системы), так что я могу взять текущее время от него. Я пытаюсь отменить старый поток и создать новый, используя часы, которые у меня уже есть.

Проблема заключается в следующем: threadTimer.interrupt() не разрушает поток таймера, поэтому, когда я создаю новый таймер, я снова запускаю два потока. Как я могу это исправить?

ответ

0

Согласно oracle doc

Если поток блокируется в вызове ожидания(), ждать (долго), или ждать (долго, INT) методы класса Object, или объединения(), join (long), join (long, int), sleep (long) или sleep (long, int), методы этого класса, тогда его статус прерывания будет очищен, и он получит InterruptedException.

Для java.util.Timer, он использует queue.wait() в mainloop() методе. Думаю, ты только что поймал InterruptedException, но ничего не сделал. Так что threadTimer не был убит.

Предлагаю вам проверить threadTimer в прослушивании событий. Если это не null и isAlive(), просто вернитесь и ничего не сделайте. Или вы можете запустить поток.

+0

My Thread.interrupt() не выбрасывает исключение InterruptedException ... – aseolin