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ć?

om.
źródło

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 ....

}
Fritz H.
źródło
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
56

Albo zadzwoń cancel()naTimer razie to wszystko robi, albo cancel()naTimerTask jeśli sam czasomierz ma inne zadania, które chcesz, aby kontynuować.

Jon Skeet
źródło
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.

Vering
źródło
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.
Abhi
źródło
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);
Ajay Kumar
źródło