Класс Timer
public class Timer extends Object
С каждым объектом Timer связан один фоновый поток, который используется для последовательного выполнения всех задач таймера. Задачи таймера должны выполняться быстро. Если выполнение задачи таймера занимает слишком много времени, она «монополизирует» поток, выполняющий задачи таймера. Это может, в свою очередь, задержать выполнение последующих задач, которые могут «сгруппироваться» и выполниться одна за другой, когда (и если) выполнение проблемной задачи наконец завершится.
После того как исчезнет последняя сильная ссылка на объект Timer и все ожидающие задачи завершат выполнение, поток, выполняющий задачи таймера, корректно завершится (и станет доступен для сборки мусора). Однако это может произойти через произвольно долгое время. По умолчанию поток, выполняющий задачи, не является потоком-демоном, поэтому он может препятствовать завершению приложения. Если вызывающий код хочет быстро завершить поток, выполняющий задачи таймера, ему следует вызвать метод cancel таймера.
Если поток, выполняющий задачи таймера, неожиданно завершится, например, в результате вызова его метода stop, любая последующая попытка запланировать задачу для таймера приведёт к IllegalStateException, как если бы был вызван метод cancel таймера.
Этот класс является потокобезопасным: несколько потоков могут использовать один объект Timer без внешней синхронизации.
Этот класс не обеспечивает гарантий работы в реальном времени: он планирует задачи с помощью метода Object.wait(long).
- Примечание об API:
- В Java 5.0 был добавлен пакет
java.util.concurrent, одной из утилит параллелизма в котором являетсяScheduledThreadPoolExecutor— пул потоков для многократного выполнения задач с заданной частотой или задержкой. Это более универсальная замена сочетаниюTimer/TimerTask: она позволяет использовать несколько служебных потоков, принимает различные единицы времени и не требует создания подклассаTimerTask(достаточно реализоватьRunnable). НастройкаScheduledThreadPoolExecutorс одним потоком делает её эквивалентнойTimer. - Примечание о реализации:
- Этот класс масштабируется для работы с большим количеством одновременно запланированных задач (тысячи задач не должны вызывать проблем). Внутри для представления очереди задач используется двоичная куча, поэтому стоимость планирования задачи составляет O(log n), где n — количество одновременно запланированных задач.
Все конструкторы запускают поток таймера.
- С версии:
- 1.3
- См. также:
Краткое описание конструкторов
| Конструктор | Описание |
|---|---|
Timer() |
Создаёт новый таймер. |
Timer |
Создаёт новый таймер, для которого можно указать, должен ли связанный с ним поток работать как поток-демон. |
Timer |
Создаёт новый таймер, связанный поток которого имеет указанное имя. |
Timer |
Создаёт новый таймер, связанный поток которого имеет указанное имя и для которого можно указать, должен ли он работать как поток-демон. |
Краткое описание методов
| Модификатор и тип | Метод | Описание |
|---|---|---|
void |
cancel() |
Завершает работу этого таймера, отменяя все запланированные на данный момент задачи. |
int |
purge() |
Удаляет все отменённые задачи из очереди задач этого таймера. |
void |
schedule |
Планирует выполнение указанной задачи после указанной задержки. |
void |
schedule |
Планирует многократное выполнение с фиксированной задержкой указанной задачи, начиная после указанной задержки. |
void |
schedule |
Планирует выполнение указанной задачи в указанное время. |
void |
schedule |
Планирует многократное выполнение с фиксированной задержкой указанной задачи, начиная в указанное время. |
void |
scheduleAtFixedRate |
Планирует многократное выполнение с фиксированной частотой указанной задачи, начиная после указанной задержки. |
void |
scheduleAtFixedRate |
Планирует многократное выполнение с фиксированной частотой указанной задачи, начиная в указанное время. |
Подробное описание конструкторов
Timer
public Timer()
Timer
public Timer(boolean isDaemon)
- Параметры:
-
isDaemon— true, если связанный поток должен работать как поток-демон.
Timer
public Timer(String name)
- Параметры:
-
name— имя связанного потока - Исключения:
-
NullPointerException— еслиnameимеет значение null - С версии:
- 1.5
Timer
public Timer(String name, boolean isDaemon)
- Параметры:
-
name— имя связанного потока -
isDaemon— true, если связанный поток должен работать как поток-демон - Исключения:
-
NullPointerException— еслиnameимеет значение null - С версии:
- 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()
TimerTask.cancel(). Этот метод не влияет на выполняющуюся в данный момент задачу (если она есть). После завершения работы таймера его поток выполнения корректно завершается, и новые задачи для него запланировать нельзя.
Обратите внимание: вызов этого метода из метода run задачи таймера, запущенной этим таймером, гарантирует, что текущее выполнение задачи будет последним выполнением, которое когда-либо будет произведено этим таймером.
Этот метод можно вызывать многократно; второй и последующие вызовы не оказывают никакого эффекта.
- См. также:
purge
public int purge()
Большинству программ нет необходимости вызывать этот метод. Он предназначен для редких приложений, отменяющих большое количество задач. Вызов этого метода позволяет сэкономить память за счёт времени: время выполнения метода может быть пропорционально n + c log n, где n — количество задач в очереди, а c — количество отменённых задач.
Обратите внимание, что этот метод можно вызывать из задачи, запланированной для этого таймера.
- Возвращает:
- количество задач, удалённых из очереди.
- С версии:
- 1.5
- См. также:
© 1993, 2025, 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/25/docs/api/java.base/java/util/Timer.html