Java Timer, TimerTask, samouczek klasy Reminder z przykładem
Opublikowany: 2021-02-04
java.util.Timer
to klasa narzędziowa, której można użyć do zaplanowania wykonania wątku w określonym czasie w przyszłości. Klasa Java Timer może służyć do planowania zadania do jednorazowego uruchomienia lub do wykonywania w regularnych odstępach czasu.
java.util.TimerTask
jest klasą abstrakcyjną, która implementuje interfejs Runnable i musimy ją rozszerzyć, aby utworzyć własny TimerTask, który można zaplanować za pomocą klasy Java Timer .
Klasa Timer jest bezpieczna dla wątków, a wiele wątków może współużytkować jeden obiekt Timer bez potrzeby zewnętrznej synchronizacji. Klasa Timer używa java.util.TaskQueue do dodawania zadań w określonych odstępach czasu i w dowolnym momencie może być tylko jeden wątek uruchamiający TimerTask, na przykład jeśli tworzysz Timer, który będzie uruchamiany co 10 sekund, ale wykonanie pojedynczego wątku zajmuje 20 sekund, wtedy obiekt Timer będzie kontynuował dodawanie zadań do kolejki i jak tylko jeden wątek zostanie zakończony, powiadomi o tym kolejkę i rozpocznie się wykonywanie innego wątku.

Klasa Timer używa Object Wait i Notify do planowania zadań. TimerTask jest abstract class
i dziedziczymy ją, aby zapewnić konkretną implementację. Klasa TimerTask implements
interface
Runnable
, więc jest to wątek, a zatem twoja implementacja TimerTask również jest wątkiem.
Bardzo prosty Timer i TimerTask Przykład: Zadanie jest wykonywane po upływie 5 seconds
.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
package com . crunchify . tutorials ; import java . util . Timer ; import java . util . TimerTask ; /** * Author: Crunchify.com */ public class CrunchifyTimerTaskExample { Timer timer ; public CrunchifyTimerTaskExample ( int seconds ) { timer = new Timer ( ) ; timer . schedule ( new CrunchifyReminder ( ) , seconds * 1000 ) ; } class CrunchifyReminder extends TimerTask { public void run ( ) { System . out . format ( "Timer Task Finished..!%n" ) ; timer . cancel ( ) ; // Terminate the timer thread } } public static void main ( String args [ ] ) { new CrunchifyTimerTaskExample ( 5 ) ; System . out . format ( "Task scheduled.. Now wait for 5 sec to see next message..%n" ) ; } } |
Wynik:
1 2 |
Task scheduled . . Now wait for 5 sec to see next message . . Time ' s up ! |
Ten prosty program ilustruje następujące podstawowe części implementacji i planowania zadania do wykonania przez wątek czasomierza:
- Zaimplementuj niestandardową podklasę
TimerTask
. Metodarun
zawiera kod, który wykonuje zadanie. W tym przykładzie podklasa nosi nazwę CrunchifyReminder. - Utwórz wątek, tworząc wystąpienie klasy
Timer
. - Utwórz wystąpienie obiektu
TimerTask
(new CrunchifyReminder()
). - Zaplanuj wykonanie zadania czasomierza.
Jak mogę wielokrotnie wykonywać to TimerTask?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 |
package crunchify . com . tutorials ; import java . util . Timer ; import java . util . TimerTask ; import java . awt . Toolkit ; /** * Author: Crunchify.com * Java Timer and TimerTask - Reminder Class Tutorials */ public class CrunchifyTimerTaskExample { // Toolkit This class is the abstract superclass of all actual implementations of the Abstract Window Toolkit. // Subclasses of the Toolkit class are used to bind the various components to particular native toolkit implementations. Toolkit toolkit ; // Timer A facility for threads to schedule tasks for future execution in a background thread. // Tasks may be scheduled for one-time execution, or for repeated execution at regular intervals. Timer timer ; public CrunchifyTimerTaskExample ( ) { toolkit = Toolkit . getDefaultToolkit ( ) ; timer = new Timer ( ) ; // schedule() Schedules the specified task for repeated fixed-delay execution, beginning after the specified delay. // Subsequent executions take place at approximately regular intervals separated by the specified period. timer . schedule ( new CrunchifyReminder ( ) , 0 , // initial delay 1 * 1000 ) ; // subsequent rate } // TimerTask A task that can be scheduled for one-time or repeated execution by a Timer. // A timer task is not reusable. Once a task has been scheduled for execution on a Timer or cancelled, // subsequent attempts to schedule it for execution will throw IllegalStateException. class CrunchifyReminder extends TimerTask { int loop = 5 ; public void run ( ) { if ( loop > 0 ) { // beep() Emits an audio beep depending on native system settings and hardware capabilities. toolkit . beep ( ) ; System . out . format ( "Knock Knock..!\n" ) ; loop -- ; } else { toolkit . beep ( ) ; System . out . format ( "\nThat's it.. Done..!" ) ; // cancel() Terminates this timer, discarding any currently scheduled tasks. Does not interfere with a currently executing task (if it exists). Once a timer has been terminated, // its execution thread terminates gracefully, and no more tasks may be scheduled on it. timer . cancel ( ) ; } } } public static void main ( String args [ ] ) { new CrunchifyTimerTaskExample ( ) ; System . out . format ( "Task scheduled..!%n \n" ) ; } } |
Wynik:
1 2 3 4 5 6 7 8 9 |
Task scheduled . . ! Knock Knock . . ! Knock Knock . . ! Knock Knock . . ! Knock Knock . . ! Knock Knock . . ! That ' s it . . Done . . ! |
Domyślnie program działa tak długo, jak działają jego wątki czasomierza. Możesz zakończyć wątek z zegarem na cztery sposoby:

- Wywołaj
cancel
na zegarze. Możesz to zrobić z dowolnego miejsca w programie, na przykład z metodyrun
zadania czasomierza. - Uczyń wątek licznika „demonem”, tworząc licznik czasu w ten sposób:
new Timer(true)
. Jeśli jedynymi wątkami pozostałymi w programie są wątki demonów, program zostanie zakończony. - Po zakończeniu wykonywania wszystkich zaplanowanych zadań czasomierza usuń wszystkie odwołania do obiektu
Timer
. W końcu wątek czasomierza zostanie zakończony. - Wywołaj metodę
System.exit
, która powoduje zakończenie całego programu (i wszystkich jego wątków).