Jak zatrzymać zadanie zaplanowane w klasie java.util.Timer


93

Używam java.util.Timerklasy i używam jej metody harmonogramu do wykonania jakiegoś zadania, ale po wykonaniu jej 6 razy muszę przerwać jej zadanie.

Jak mam to zrobić?

Odpowiedzi:


141

Zachowaj gdzieś odniesienie do timera i użyj:

timer.cancel();
timer.purge();

przestać cokolwiek robi. Możesz umieścić ten kod wewnątrz zadania, które wykonujesz, za pomocą a, static intaby policzyć, ile razy przeszedłeś, np

private static int count = 0;
public static void run() {
     count++;
     if (count >= 6) {
         timer.cancel();
         timer.purge();
         return;
     }

     ... perform task here ....

}

10
Myślę, że anulowanie wystarczy, nie trzeba czyścić
LiangWang

1
czy dobrze jest dodać timer.cancel () w finale zgodnie z (Effetive Java book)
Tushar Pandey

1
@Jacky to dobra praktyka, aby mieć oba, ale teoretycznie cancelsamo zadziała.
Fritz H

10
@Jacky ma rację. Spójrz na implementację Timera. Wywołanie czyszczenia po anulowaniu jest całkowicie bezużyteczne. Anuluj czyści całą listę zadań, podczas gdy czyszczenie iteruje po tej samej liście, sprawdza, czy stan to ANULOWANE, a następnie usuwa zadania.
Boyan

2
jeśli czynność / fragment, który uruchomił Timer, zostanie zniszczona lub zatrzymana, czy zaplanowany czasomierz samoczynnie się zatrzyma?
aLL


28

Powinieneś zatrzymać zadanie zaplanowane dla timera: Twój timer:

Timer t = new Timer();
TimerTask tt = new TimerTask() {
    @Override
    public void run() {
        //do something
    };
}
t.schedule(tt,1000,1000);

Aby zatrzymać:

tt.cancel();
t.cancel(); //In order to gracefully terminate the timer thread

Zwróć uwagę, że samo anulowanie licznika czasu nie zakończy trwających zadań czasowych.


Mam dwie metody. Czy można zatrzymać TimerTask z innej metody?
Sachin HR

16
timer.cancel();  //Terminates this timer,discarding any currently scheduled tasks.

timer.purge();   // Removes all cancelled tasks from this timer's task queue.

1

Wyłącz stoper raz po przebudzeniu w określonym czasie w milisekundach.

Timer t = new Timer();
t.schedule(new TimerTask() {
            @Override
             public void run() {
             System.out.println(" Run spcific task at given time.");
             t.cancel();
             }
 }, 10000);
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.