Класс 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 |
Планирует многократное выполнение с фиксированной частотой указанной задачи, начиная в заданное время. |
Методы, объявленные в классе Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait | Модификатор и тип | Метод | Описание |
|---|---|---|
protected Object |
clone() |
Создает и возвращает копию этого объекта. |
boolean |
equals |
Указывает, является ли другой объект «равным» этому объекту. |
protected void |
finalize() |
Устарело, будет удалено: этот элемент API может быть удален в будущей версии. Финализация объявлена устаревшей и будет удалена в одном из будущих выпусков. |
final Class |
getClass() |
Возвращает класс времени выполнения этого объекта Object. |
int |
hashCode() |
Возвращает хеш-код этого объекта. |
final void |
notify() |
Пробуждает один поток, ожидающий на мониторе этого объекта. |
final void |
notifyAll() |
Пробуждает все потоки, ожидающие на мониторе этого объекта. |
String |
toString() |
Возвращает строковое представление объекта. |
final void |
wait() |
Заставляет текущий поток ожидать пробуждения, обычно вследствие уведомления или прерывания. |
final void |
wait |
Заставляет текущий поток ожидать пробуждения, обычно вследствие уведомления или прерывания, либо до истечения заданного промежутка реального времени. |
final void |
wait |
Заставляет текущий поток ожидать пробуждения, обычно вследствие уведомления или прерывания, либо до истечения заданного промежутка реального времени. |
Подробное описание конструкторов
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.