Классы java.util.Timer и java.util.TimerTask являются стандартными классами для имплементации задачи и планирования ее выполенения.
Класс Timer в Java предназначен для того, чтобы запускать задачу единожды или с определённой цикличностью.
Класс TimerTask является абстрактным и поэтому нуждается в определённой имплементации. В свою очередь он имплементирует интерфейс Runnable, предоставляя дополнительные возможности многопоточности. Унаследовавшись от класса TimerTask мы должны создать свой объект задачи.
Принцип работы
Как уже было сказано выше, Timer в Java — служебный класс, который выполняет в системе определенную роль, а именно запуск программных процессов по своему расписанию. Он запускает определенный поток, работающий в фоновом режиме.
При этом процедура запуска доступна в повторяющемся цикле, что позволяет построить определённый график выполнения задач.
Класс Timer является потокобезопасным, поэтому он может использоваться без синхронизации данных. Одновременно в классе Timer может выполняться только один поток. При возникновении коллизии если потоки накладывается они становится в очередь.
Методы класса Timer в Java
Ниже приведён краткий список методов таймера, которые зачастую используются при написании программ.
- cancel() — предусмотрен для того, чтобы прерывать текущую задачу;
- purge() — удаляет все отмененные задачи из очереди. Если на задачу нет внешних ссылок, она автоматически становится невалидной для сборщика мусора (garbage collector);
- schedule (TimerTask task, long delay) — планирование задачи c отложенным запуском в милисекундах;
- schedule (TimerTask task, long delay, long period) — аналогичный предыдущему методу, с тем отличием, что процесс может повторяться многократно с учетом указанного периода времени в миллисекундах;
- schedule (TimerTask task, Date when) — планировка задания с учетом времени старта, установленным в when параметре;
- schedule(TimerTask task, Date when, long period) — аналогичный предыдущему, но с учетом многократного повторения функции за определенный период времени, параметр period;
- scheduleAtFixedRate (TimerTask task, long delay, long period) — также происходит цикличные планирование запуска задач с учётом предыдущего запуска.
- scheduleAtFixedRate (TimerTask task, Date when, long period) — очень похож на предыдущий с разницей только в том, что указывается дата запуска.
Пример запуска отдельного таймера
class TimerTaskTest extends TimerTask {
@Override
public void run() {
System.out.println("TimerTask started at:" + new Date());
try {
Thread.sleep(15000);
} catch (InterruptedException e) {
}
System.out.println("TimerTask ended at:" + new Date());
}
public static void main(String args[]) {
TimerTask timerTask = new TimerTaskTest();
Timer timer = new Timer(true);
timer.scheduleAtFixedRate(timerTask, 0, 15 * 1000);
System.out.println("TimerTaskTest started");
try {
Thread.sleep(150000);
timer.cancel();
System.out.println("TimerTask canceled");
Thread.sleep(30000);
} catch (InterruptedException e) {
}
}
}
Вывод:
TimerTaskTest started
TimerTask started at:Fri Aug 20 18:58:57 EEST 2021
TimerTask ended at:Fri Aug 20 18:59:12 EEST 2021
TimerTask started at:Fri Aug 20 18:59:12 EEST 2021
TimerTask ended at:Fri Aug 20 18:59:27 EEST 2021
TimerTask started at:Fri Aug 20 18:59:27 EEST 2021
TimerTask ended at:Fri Aug 20 19:01:12 EEST 2021
TimerTask started at:Fri Aug 20 19:01:12 EEST 2021
TimerTask canceled