Java Timer, TimerTask, учебник по классу напоминаний с примером
Опубликовано: 2021-02-04
java.util.Timer
— это служебный класс, который можно использовать для планирования выполнения потока в определенное время в будущем. Класс Java Timer можно использовать для планирования однократного запуска задачи или запуска через регулярные промежутки времени.
java.util.TimerTask
— это абстрактный класс, который реализует интерфейс Runnable, и нам нужно расширить этот класс, чтобы создать собственный TimerTask, который можно планировать с помощью класса java Timer .
Класс Timer является потокобезопасным, и несколько потоков могут совместно использовать один объект Timer без необходимости внешней синхронизации. Класс Timer использует java.util.TaskQueue для добавления задач с заданным регулярным интервалом, и в любое время может быть только один поток, выполняющий TimerTask, например, если вы создаете таймер для запуска каждые 10 секунд, но выполнение одного потока занимает 20 секунд, затем объект Timer будет продолжать добавлять задачи в очередь, и как только один поток будет завершен, он уведомит очередь, и другой поток начнет выполняться.

Класс Timer использует методы ожидания и уведомления объекта для планирования задач. TimerTask — это abstract class
, и мы наследуем его, чтобы обеспечить конкретную реализацию. Класс TimerTask implements
interface
Runnable
, поэтому это поток, и, следовательно, ваша реализация TimerTask также является потоком.
Очень простой пример Timer и TimerTask: задача выполняется по прошествии 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" ) ; } } |
Результат:
1 2 |
Task scheduled . . Now wait for 5 sec to see next message . . Time ' s up ! |
Эта простая программа иллюстрирует следующие основные части реализации и планирования задачи, которая будет выполняться потоком таймера:
- Реализуйте собственный подкласс
TimerTask
. Методrun
содержит код, выполняющий задачу. В этом примере подкласс называется CrunchifyReminder. - Создайте поток, создав экземпляр класса
Timer
. - Создайте экземпляр объекта
TimerTask
(new CrunchifyReminder()
). - Запланируйте выполнение задачи таймера.
Как я могу выполнять эту 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" ) ; } } |
Результат:
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 . . ! |
По умолчанию программа продолжает работать, пока работают ее потоки таймера. Вы можете завершить поток таймера четырьмя способами:

- Вызвать
cancel
на таймере. Вы можете сделать это из любого места в программе, например, из методаrun
задачи таймера. - Сделайте поток таймера «демоном», создав таймер следующим образом:
new Timer(true)
. Если в программе остались только потоки демона, программа завершается. - После завершения выполнения всех запланированных задач таймера удалите все ссылки на объект
Timer
. В конце концов, поток таймера завершится. - Вызовите метод
System.exit
, который завершает работу всей программы (и всех ее потоков).