2013-04-19 3 views
10

Я пытаюсь сделать простой таймер, который воспроизводит звуковой сигнал после указанного количества секунд. Мне удалось заставить его работать, но TimerTask продолжает работать после звукового сигнала. Теперь я прекращаю выполнение? Вот мой код:Как остановить работу TimerTask

import java.util.Scanner; 
import java.util.Timer; 
import java.util.TimerTask; 
import java.awt.Toolkit; 

class Alarm { 

    public static void main(String[] args) { 
     long delay; 
     Scanner scan = new Scanner(System.in); 
     System.out.print("Enter a delay in seconds: "); 
     delay = scan.nextInt()*1000; 

     Timer timer = new Timer(); 

     TimerTask task = new TimerTask() { 
      @Override 
      public void run() { 
       Toolkit.getDefaultToolkit().beep(); 
      } 
     }; 

     timer.schedule(task, delay); 
    } 
} 
+0

Я сожалею. Я понял это очень быстро сразу после публикации. Я должен был объявить таймер как final и вызвать timer.cancel() после звукового сигнала внутри метода run(). Не уверен, что это отличное решение для вызова метода локальных переменных из внутреннего класса, хотя ... – Zim

ответ

24

Вам нужно отменить таймер вызова следующих методов

timer.cancel(); // Terminates this timer, discarding any currently scheduled tasks. 
timer.purge(); // Removes all cancelled tasks from this timer's task queue. 

Это отменит задание, поэтому что-то вроде этого будет работать:

import java.util.Scanner; 
import java.util.Timer; 
import java.util.TimerTask; 
import java.awt.Toolkit; 

class Alarm { 

    private static boolean run = true; 

    public static void main(String[] args) { 
     long delay; 
     Scanner scan = new Scanner(System.in); 
     System.out.print("Enter a delay in seconds: "); 
     delay = scan.nextInt()*1000; 

     final Timer timer = new Timer(); 

     final TimerTask task = new TimerTask() { 
      @Override 
      public void run() { 
       if(run) { 
        Toolkit.getDefaultToolkit().beep(); 
       } else { 
        timer.cancel(); 
        timer.purge(); 
       } 
      } 
     }; 

     timer.schedule(task, delay); 

     // set run to false here to stop the timer. 
     run = false; 
    } 
} 
+0

Скопировано здесь http://stackoverflow.com/questions/1409116/how-to-stop-the-task-scheduled-in-java-util-timer-class –

+0

Я пробовал это, это не сработало. Как будет выполняться когда-либо переходить на false в вашем примере? Я только что вызвал timer.cancel() непосредственно после звукового сигнала, и он сработал. – Zim

+0

Мы будем, это зависит от вас, конечно. Вы можете хранить таймер, как в ссылке Баадшаха, или использовать какое-то другое условие. Когда вы хотите остановить звуковой сигнал? –

0

cancel() должен сделать это - cancel останавливает отменяет данное TimerTask/Timer

+0

отменяет запланированные задачи, но не активен. ну, я думаю, это не имеет значения в этом примере. – bvdb

+0

Как насчет ** чистки() **? –

3

Вот что работал для меня (используется продувка() предложение также):

import java.util.Scanner; 
import java.util.Timer; 
import java.util.TimerTask; 
import java.awt.Toolkit; 

class Alarm { 

    public static void main(String[] args) { 
     long delay; 
     Scanner scan = new Scanner(System.in); 
     System.out.print("Enter a delay in seconds: "); 
     delay = scan.nextInt()*1000; 

     final Timer timer = new Timer(); 

     final TimerTask task = new TimerTask() { 
      @Override 
      public void run() { 
       Toolkit.getDefaultToolkit().beep(); 
       timer.cancel(); 
       timer.purge(); 
      } 
     }; 

     timer.schedule(task, delay); 
    } 
} 
+0

Зачем это работало? –

Смежные вопросы