Класс Timer
- java.lang.Object
-
- java.util.Timer
public class Timer extends Object
Утилита для потоков, позволяющая планировать задачи для выполнения в фоновом потоке в будущем. Задачи могут быть запланированы на однократное выполнение или на многократное выполнение с регулярными интервалами.
Каждому объекту Timer соответствует отдельный фоновый поток, который используется для последовательного выполнения всех задач таймера. Задачи таймера должны завершаться быстро. Если задача таймера занимает слишком много времени для завершения, она «захватывает» поток выполнения задач таймера. Это, в свою очередь, может задерживать выполнение последующих задач, которые могут «накапливаться» и выполняться в быстрой последовательности, когда (и если) проблемная задача, наконец, завершится.
После того, как последняя активная ссылка на объект Timer исчезнет и все незавершенные задачи завершат свое выполнение, поток выполнения задач таймера завершается корректно (и становится доступным для сборки мусора). Однако это может занимать произвольно долгое время. По умолчанию поток выполнения задач не работает как демон-поток, поэтому он может препятствовать завершению приложения. Если вызывающей стороне нужно быстро завершить поток выполнения задач таймера, вызывающая сторона должна вызвать метод cancel таймера.
Если поток выполнения задач таймера завершается неожиданно, например, из-за вызова метода stop, любая последующая попытка запланировать задачу на таймере приведет к IllegalStateException, как если бы был вызван метод cancel таймера.
Этот класс потокобезопасен: несколько потоков могут совместно использовать один объект Timer без необходимости внешней синхронизации.
Этот класс не предоставляет гарантий реального времени: он планирует задачи, используя метод Object.wait(long).
В Java 5.0 был представлен пакет java.util.concurrent и одна из утилит для работы с конкурентностью в нем — ScheduledThreadPoolExecutor, которая представляет собой пул потоков для многократного выполнения задач с заданной скоростью или задержкой. Это эффективная замена комбинации Timer/TimerTask, поскольку она позволяет использовать несколько потоков обслуживания, принимает различные единицы времени и не требует наследования TimerTask (достаточно реализовать Runnable). Настройка
ScheduledThreadPoolExecutor с одним потоком эквивалентна Timer.
Примечание по реализации: Этот класс масштабируется до большого количества одновременно запланированных задач (тысячи задач не должны представлять проблемы). Внутри он использует двоичную кучу для представления очереди задач, поэтому стоимость планирования задачи составляет O(log n), где n — количество одновременно запланированных задач.
Примечание по реализации: Все конструкторы запускают поток таймера.
- Since:
- 1.3
- См. также:
-
TimerTask,Object.wait(long)
Конструкторы
| Конструктор | Описание |
|---|---|
Timer() | Создает новый таймер. |
Timer(boolean isDaemon) | Создает новый таймер, у которого ассоциированный поток может быть задан для работы в качестве демон-потока. |
Timer(String name) | Создает новый таймер, у которого ассоциированный поток имеет указанное имя. |
Timer(String name,
boolean isDaemon) | Создает новый таймер, у которого ассоциированный поток имеет указанное имя и может быть задан для работы в качестве демон-потока. |
Методы
| Модификатор и тип | Метод | Описание |
|---|---|---|
void | cancel() | Завершает этот таймер, отбрасывая все запланированные задачи. |
int | purge() | Удаляет все отменённые задачи из очереди задач этого таймера. |
void | schedule(TimerTask task,
long delay) | Планирует указанную задачу для выполнения после указанной задержки. |
void | schedule(TimerTask task,
long delay,
long period) | Планирует указанную задачу для многократного выполнения с фиксированной задержкой, начиная после указанной задержки. |
void | schedule(TimerTask task,
Date time) | Планирует указанную задачу для выполнения в указанное время. |
void | schedule(TimerTask task,
Date firstTime,
long period) | Планирует указанную задачу для многократного выполнения с фиксированной задержкой, начиная в указанное время. |
void | scheduleAtFixedRate(TimerTask task,
long delay,
long period) | Планирует указанную задачу для многократного выполнения с фиксированной скоростью, начиная после указанной задержки. |
void | scheduleAtFixedRate(TimerTask task,
Date firstTime,
long period) | Планирует указанную задачу для многократного выполнения с фиксированной скоростью, начиная в указанное время. |
Методы, объявленные в классе java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait Подробное описание конструкторов
Timer
public Timer()
Создает новый таймер. Ассоциированный поток не работает в качестве демон-потока.
Timer
public Timer(boolean isDaemon)
Создаёт новый таймер, у которого ассоциированный поток может быть задан для работы в качестве демон-потока. Демон-поток используется, если таймер будет использоваться для планирования повторяющихся «процессов обслуживания», которые должны выполняться, пока приложение работает, но не должны продлевать срок жизни приложения.
- Параметры:
-
isDaemon- true, если ассоциированный поток должен работать в качестве демон-потока.
Timer
public Timer(String name)
Создаёт новый таймер, у которого ассоциированный поток имеет указанное имя. Ассоциированный поток не работает в качестве демон-потока.
- Параметры:
-
name- имя ассоциированного потока - Исключения:
-
NullPointerException- еслиnameравно null - Since:
- 1.5
Timer
public Timer(String name,
boolean isDaemon) Создаёт новый таймер, у которого ассоциированный поток имеет указанное имя и может быть задан для работы в качестве демон-потока.
- Параметры:
-
name- имя ассоциированного потока -
isDaemon- true, если ассоциированный поток должен работать в качестве демон-потока - Исключения:
-
NullPointerException- еслиnameравно null - Since:
- 1.5
Методы
schedule
public void schedule(TimerTask task,
long delay) Планирует выполнение указанной задачи после указанной задержки.
- Параметры:
-
task- задача, которая должна быть запланирована. -
delay- задержка в миллисекундах перед выполнением задачи. - Исключения:
-
IllegalArgumentException- еслиdelayотрицательное илиdelay + System.currentTimeMillis()отрицательное. -
IllegalStateException- если задача уже была запланирована или отменена, таймер был отменён или поток таймера завершён. -
NullPointerException- еслиtaskравно null
schedule
public void schedule(TimerTask task,
Date time) Планирует выполнение указанной задачи в указанное время. Если время в прошлом, задача планируется для немедленного выполнения.
- Параметры:
-
task- задача, которая должна быть запланирована. -
time- время, в которое задача должна быть выполнена. - Исключения:
-
IllegalArgumentException- еслиtime.getTime()отрицательное. -
IllegalStateException- если задача уже была запланирована или отменена, таймер был отменён или поток таймера завершён. -
NullPointerException- еслиtaskилиtimeравно null
schedule
public void schedule(TimerTask task,
long delay,
long period) Планирует выполнение указанной задачи с повторным выполнением с фиксированной задержкой, начиная после указанной задержки. Последующие выполнения происходят с приблизительно равными интервалами, разделёнными указанным периодом.
При выполнении с фиксированной задержкой каждое выполнение планируется относительно фактического времени выполнения предыдущего выполнения. Если выполнение задерживается по любой причине (например, сборка мусора или другая фоновая активность), последующие выполнения также будут задерживаться. В долгосрочной перспективе частота выполнения обычно будет немного ниже, чем обратная величина указанного периода (при условии точности системных часов, лежащих в основе Object.wait(long)).
Выполнение с фиксированной задержкой подходит для повторяющихся задач, требующих «плавности». Другими словами, это подходит для задач, где более важно поддерживать точность частоты в краткосрочной перспективе, чем в долгосрочной. Это включает большинство задач анимации, таких как мигание курсора с определёнными интервалами. Это также включает задачи, в которых регулярная деятельность выполняется в ответ на ввод пользователя, например, автоматическое повторение символа, пока удерживается клавиша.
- Параметры:
-
task- задача, которая должна быть запланирована. -
delay- задержка в миллисекундах перед выполнением задачи. -
period- время в миллисекундах между последовательными выполнениями задачи. - Исключения:
-
IllegalArgumentException- еслиdelay < 0, илиdelay + System.currentTimeMillis() < 0, илиperiod <= 0 -
IllegalStateException- если задача уже была запланирована или отменена, таймер был отменён или поток таймера завершён. -
NullPointerException- еслиtaskравно null
schedule
public void schedule(TimerTask task,
Date firstTime,
long period) Планирует выполнение указанной задачи с повторным выполнением с фиксированной задержкой, начиная в указанное время. Последующие выполнения происходят с приблизительно равными интервалами, разделёнными указанным периодом.
При выполнении с фиксированной задержкой каждое выполнение планируется относительно фактического времени выполнения предыдущего выполнения. Если выполнение задерживается по любой причине (например, сборка мусора или другая фоновая активность), последующие выполнения также будут задерживаться. В долгосрочной перспективе частота выполнения обычно будет немного ниже, чем обратная величина указанного периода (при условии точности системных часов, лежащих в основе Object.wait(long)). Вследствие этого, если запланированное первое время находится в прошлом, оно планируется для немедленного выполнения.
Выполнение с фиксированной задержкой подходит для повторяющихся задач, требующих «плавности». Другими словами, это подходит для задач, где более важно поддерживать точность частоты в краткосрочной перспективе, чем в долгосрочной. Это включает большинство задач анимации, таких как мигание курсора с определёнными интервалами. Это также включает задачи, в которых регулярная деятельность выполняется в ответ на ввод пользователя, например, автоматическое повторение символа, пока удерживается клавиша.
- Параметры:
-
task- задача, которая должна быть запланирована. -
firstTime- Первое время, в которое задача должна быть выполнена. -
period- время в миллисекундах между последовательными выполнениями задачи. - Исключения:
-
IllegalArgumentException- еслиfirstTime.getTime() < 0, илиperiod <= 0 -
IllegalStateException- если задача уже была запланирована или отменена, таймер был отменён или поток таймера завершён. -
NullPointerException- еслиtaskилиfirstTimeравно null
scheduleAtFixedRate
public void scheduleAtFixedRate(TimerTask task,
long delay,
long period) Планирует выполнение указанной задачи с повторным выполнением с фиксированной частотой, начиная после указанной задержки. Последующие выполнения происходят с приблизительно равными интервалами, разделёнными указанным периодом.
При выполнении с фиксированной частотой каждое выполнение планируется относительно запланированного времени выполнения начального выполнения. Если выполнение задерживается по любой причине (например, сборка мусора или другая фоновая активность), два или более выполнения произойдут последовательно, чтобы «нагнать упущенное». В долгосрочной перспективе частота выполнения будет точно равна обратному значению указанного периода (при условии точности системных часов, лежащих в основе Object.wait(long)).
Выполнение с фиксированной частотой подходит для повторяющихся задач, чувствительных к абсолютному времени, таких как звонок колокола каждый час в час, или выполнение запланированного технического обслуживания каждый день в определённое время. Это также подходит для повторяющихся задач, где общее время выполнения фиксированного количества выполнений важно, например, таймер обратного отсчёта, который тикает раз в секунду в течение десяти секунд. Наконец, выполнение с фиксированной частотой подходит для планирования нескольких повторяющихся задач таймера, которые должны оставаться синхронизированными друг с другом.
- Параметры:
-
task- задача, которая должна быть запланирована. -
delay- задержка в миллисекундах перед выполнением задачи. -
period- время в миллисекундах между последовательными выполнениями задачи. - Исключения:
-
IllegalArgumentException- еслиdelay < 0, илиdelay + System.currentTimeMillis() < 0, илиperiod <= 0 -
IllegalStateException- если задача уже была запланирована или отменена, таймер был отменён или поток таймера завершён. -
NullPointerException- еслиtaskравно null
scheduleAtFixedRate
public void scheduleAtFixedRate(TimerTask task,
Date firstTime,
long period) Планирует выполнение указанной задачи с повторным выполнением с фиксированной частотой, начиная в указанное время. Последующие выполнения происходят с приблизительно равными интервалами, разделёнными указанным периодом.
При выполнении с фиксированной частотой каждое выполнение планируется относительно запланированного времени выполнения начального выполнения. Если выполнение задерживается по любой причине (например, сборка мусора или другая фоновая активность), два или более выполнения произойдут последовательно, чтобы «нагнать упущенное». В долгосрочной перспективе частота выполнения будет точно равна обратному значению указанного периода (при условии точности системных часов, лежащих в основе Object.wait(long)). Вследствие этого, если запланированное первое время находится в прошлом, любые «упущенные» выполнения будут запланированы для немедленного «нагона».
Выполнение с фиксированной частотой подходит для повторяющихся задач, чувствительных к абсолютному времени, таких как звонок колокола каждый час в час, или выполнение запланированного технического обслуживания каждый день в определённое время. Это также подходит для повторяющихся задач, где общее время выполнения фиксированного количества выполнений важно, например, таймер обратного отсчёта, который тикает раз в секунду в течение десяти секунд. Наконец, выполнение с фиксированной частотой подходит для планирования нескольких повторяющихся задач таймера, которые должны оставаться синхронизированными друг с другом.
- Параметры:
-
task- задача, которая должна быть запланирована. -
firstTime- Первое время, в которое задача должна быть выполнена. -
period- время в миллисекундах между последовательными выполнениями задачи. - Исключения:
-
IllegalArgumentException- еслиfirstTime.getTime() < 0илиperiod <= 0 -
IllegalStateException- если задача уже была запланирована или отменена, таймер был отменён или поток таймера завершён. -
NullPointerException- еслиtaskилиfirstTimeравно null
cancel
public void cancel()
Завершает этот таймер, отбрасывая все текущие запланированные задачи. Не мешает текущему выполняющемуся заданию (если оно существует). После завершения таймера его поток выполнения завершается корректно, и больше задач не могут быть запланированы на него.
Обратите внимание, что вызов этого метода внутри метода run задачи таймера, вызванной этим таймером, гарантирует, что текущее выполнение задачи является последним выполнением задачи, которое когда-либо будет выполнено этим таймером.
Этот метод можно вызывать многократно; второй и последующие вызовы не имеют эффекта.
purge
public int purge()
Удаляет все отменённые задачи из очереди задач этого таймера. Вызов этого метода не влияет на поведение таймера, но устраняет ссылки на отменённые задачи из очереди. Если нет внешних ссылок на эти задачи, они становятся доступны для сборки мусора.
Большинству программ не нужно вызывать этот метод. Он разработан для использования в редких приложениях, которые отменяют большое количество задач. Вызов этого метода тратит время на пространство: время выполнения метода может быть пропорционально n + c log n, где n — количество задач в очереди, а c — количество отменённых задач.
Обратите внимание, что вызов этого метода допустим внутри задачи, запланированной на этом таймере.
- Возвращает:
- количество задач, удалённых из очереди.
- С:
- 1.5
© 1993, 2020, Oracle and/or its affiliates. All rights reserved.
Documentation extracted from Debian's OpenJDK Development Kit package.
Licensed under the GNU General Public License, version 2, with the Classpath Exception.
Various third party code in OpenJDK is licensed under different licenses (see Debian package).
Java and OpenJDK are trademarks or registered trademarks of Oracle and/or its affiliates.
https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/util/Timer.html