public class Timer
extends Object
java.lang.Object | |
↳ | java.util.Timer |
线程的工具,用于在后台线程中安排将来执行的任务。 可以安排一次性执行任务,或定期重复执行任务。
对应于每个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是并发计划任务的数量。
实现注释:所有构造函数都启动一个计时器线程。
也可以看看:
Public constructors |
|
---|---|
Timer() 创建一个新的计时器。 |
|
Timer(boolean isDaemon) 创建一个新的定时器,其关联线程可以被指定为 run as a daemon 。 |
|
Timer(String name) 创建一个新的定时器,其关联线程具有指定的名称。 |
|
Timer(String name, boolean isDaemon) 创建一个新的定时器,其关联线程具有指定的名称,并且可以指定为 run as a daemon 。 |
Public methods |
|
---|---|
void |
cancel() 终止此计时器,放弃当前计划的任务。 |
int |
purge() 从该计时器的任务队列中删除所有取消的任务。 |
void |
schedule(TimerTask task, long delay, long period) 在指定 的延迟后开始重复 执行固定延迟执行的指定任务。 |
void |
schedule(TimerTask task, Date time) 计划指定的任务在指定的时间执行。 |
void |
schedule(TimerTask task, Date firstTime, long period) 从指定的时间开始,为重复的 固定延迟执行计划指定的任务。 |
void |
schedule(TimerTask task, long delay) 在指定的延迟后安排指定的任务执行。 |
void |
scheduleAtFixedRate(TimerTask task, long delay, long period) 在指定延迟后开始计划重复 固定费率执行的指定任务。 |
void |
scheduleAtFixedRate(TimerTask task, Date firstTime, long period) 从指定的时间开始计划重复 固定费率执行的指定任务。 |
Inherited methods |
|
---|---|
From class java.lang.Object
|
Timer (boolean isDaemon)
创建一个新的定时器,其相关联的线程可以被指定为run as a daemon 。 如果计时器将用于安排重复的“维护活动”,则守护程序线程将被调用,只要应用程序正在运行,必须执行该操作,但不应延长应用程序的生命周期。
Parameters | |
---|---|
isDaemon |
boolean : true if the associated thread should run as a daemon. |
Timer (String name)
创建一个新的定时器,其关联线程具有指定的名称。 相关的线程不 run as a daemon 。
Parameters | |
---|---|
name |
String : the name of the associated thread |
Throws | |
---|---|
NullPointerException |
if name is null |
Timer (String name, boolean isDaemon)
创建一个新的定时器,其关联线程具有指定的名称,并且可以指定为 run as a daemon 。
Parameters | |
---|---|
name |
String : the name of the associated thread |
isDaemon |
boolean : true if the associated thread should run as a daemon |
Throws | |
---|---|
NullPointerException |
if name is null |
void cancel ()
终止此计时器,放弃当前计划的任务。 不干扰当前正在执行的任务(如果存在)。 一旦计时器被终止,它的执行线程将优雅地终止,并且不会安排更多的任务。
请注意,从该计时器调用的计时器任务的run方法内调用此方法可绝对保证正在进行的任务执行是此计时器执行的最后一次任务执行。
这种方法可能会被重复调用; 第二次和后续的呼叫都不起作用。
int purge ()
从该计时器的任务队列中删除所有取消的任务。 调用此方法对计时器的行为没有影响 ,但会从队列中消除对已取消任务的引用。 如果没有对这些任务的外部引用,则它们有资格进行垃圾回收。
大多数程序都不需要调用这个方法。 它被设计用于取消大量任务的罕见应用程序。 调用此方法会为空间换取时间:方法的运行时间可能与n + c log n成比例,其中n是队列中的任务数,c是已取消任务的数量。
请注意,可以在此计时器上计划的任务中调用此方法。
Returns | |
---|---|
int |
the number of tasks removed from the queue. |
void schedule (TimerTask task, long delay, long period)
在指定的延迟后开始重复执行固定延迟执行的指定任务。 随后的执行大约按规定的时间间隔进行,并与指定的时间段分开。
在固定延迟执行中,每个执行都相对于上次执行的实际执行时间进行调度。 如果由于任何原因(如垃圾收集或其他后台活动)延迟执行,后续执行也会延迟。 从长远来看,执行频率通常会略低于指定周期的倒数(假设Object.wait(long)的系统时钟准确)。
固定延迟执行适用于需要“平滑”的重复活动。 换句话说,对于短期内保持频率比长期保持频率更为重要的活动更为适宜。 这包括大多数动画任务,例如定期闪烁光标。 它还包括为响应人类输入而执行常规活动的任务,例如只要按住一个键就自动重复一个字符。
Parameters | |
---|---|
task |
TimerTask : task to be scheduled. |
delay |
long : delay in milliseconds before task is to be executed. |
period |
long : time in milliseconds between successive task executions. |
Throws | |
---|---|
IllegalArgumentException |
if delay < 0 , or delay + System.currentTimeMillis() < 0 , or period <= 0 |
IllegalStateException |
if task was already scheduled or cancelled, timer was cancelled, or timer thread terminated. |
NullPointerException |
if task is null |
void schedule (TimerTask task, Date time)
计划指定的任务在指定的时间执行。 如果时间在过去,则任务计划立即执行。
Parameters | |
---|---|
task |
TimerTask : task to be scheduled. |
time |
Date : time at which task is to be executed. |
Throws | |
---|---|
IllegalArgumentException |
if time.getTime() is negative. |
IllegalStateException |
if task was already scheduled or cancelled, timer was cancelled, or timer thread terminated. |
NullPointerException |
if task or time is null |
void schedule (TimerTask task, Date firstTime, long period)
从指定的时间开始,为重复的固定延迟执行计划指定的任务。 随后的执行大致按规定的时间间隔进行,并按指定的时间间隔分开。
在固定延迟执行中,每个执行都相对于上次执行的实际执行时间进行调度。 如果由于任何原因(如垃圾收集或其他后台活动)延迟执行,后续执行也会延迟。 从长远来看,执行频率通常会略低于指定周期的倒数(假设Object.wait(long)的系统时钟准确)。 由于以上所述,如果计划的第一次是过去,则计划立即执行。
固定延迟执行适用于需要“平滑”的重复活动。 换句话说,对于短期内保持频率比长期保持频率更为重要的活动更为适宜。 这包括大多数动画任务,例如定期闪烁光标。 它还包括为响应人类输入而执行常规活动的任务,例如只要按住一个键就自动重复一个字符。
Parameters | |
---|---|
task |
TimerTask : task to be scheduled. |
firstTime |
Date : First time at which task is to be executed. |
period |
long : time in milliseconds between successive task executions. |
Throws | |
---|---|
IllegalArgumentException |
if firstTime.getTime() < 0 , or period <= 0 |
IllegalStateException |
if task was already scheduled or cancelled, timer was cancelled, or timer thread terminated. |
NullPointerException |
if task or firstTime is null |
void schedule (TimerTask task, long delay)
在指定的延迟后安排指定的任务执行。
Parameters | |
---|---|
task |
TimerTask : task to be scheduled. |
delay |
long : delay in milliseconds before task is to be executed. |
Throws | |
---|---|
IllegalArgumentException |
if delay is negative, or delay + System.currentTimeMillis() is negative. |
IllegalStateException |
if task was already scheduled or cancelled, timer was cancelled, or timer thread terminated. |
NullPointerException |
if task is null |
void scheduleAtFixedRate (TimerTask task, long delay, long period)
在指定延迟后开始计划重复固定费率执行的指定任务。 随后的执行大致按规定的时间间隔进行,并按指定的时间间隔分开。
在固定速率执行中,每个执行都相对于初始执行的计划执行时间进行调度。 如果由于任何原因(例如垃圾收集或其他后台活动)延迟执行,两个或更多执行将会快速连续发生以“赶上”。 从长远来看,执行的频率恰好是指定周期的倒数(假设Object.wait(long)的系统时钟是准确的)。
固定费率执行适用于对绝对时间敏感的周期性活动,例如每小时按小时响铃或在特定时间每天运行计划内维护。 对于执行固定执行次数的总时间很重要的循环活动也是适当的,例如倒数计时器每秒钟滴答一次,持续十秒钟。 最后,固定速率执行适用于调度必须保持相互同步的多个重复计时器任务。
Parameters | |
---|---|
task |
TimerTask : task to be scheduled. |
delay |
long : delay in milliseconds before task is to be executed. |
period |
long : time in milliseconds between successive task executions. |
Throws | |
---|---|
IllegalArgumentException |
if delay < 0 , or delay + System.currentTimeMillis() < 0 , or period <= 0 |
IllegalStateException |
if task was already scheduled or cancelled, timer was cancelled, or timer thread terminated. |
NullPointerException |
if task is null |
void scheduleAtFixedRate (TimerTask task, Date firstTime, long period)
从指定的时间开始计划重复固定费率执行的指定任务。 随后的执行大致按规定的时间间隔进行,并按指定的时间间隔分开。
在固定速率执行中,每个执行都相对于初始执行的计划执行时间进行调度。 如果由于任何原因(例如垃圾收集或其他后台活动)延迟执行,两个或更多执行将会快速连续发生以“赶上”。 从长远来看,执行的频率恰好是指定周期的倒数(假设Object.wait(long)的系统时钟是准确的)。 由于以上所述,如果计划的第一次是过去,则任何“错过”的执行将被安排立即“追赶”执行。
固定费率执行适用于对绝对时间敏感的周期性活动,例如每小时按小时响铃或在特定时间每天运行计划内维护。 对于执行固定执行次数的总时间很重要的循环活动也是适当的,例如倒数计时器每秒钟滴答一次,持续十秒钟。 最后,固定速率执行适用于调度必须保持相互同步的多个重复计时器任务。
Parameters | |
---|---|
task |
TimerTask : task to be scheduled. |
firstTime |
Date : First time at which task is to be executed. |
period |
long : time in milliseconds between successive task executions. |
Throws | |
---|---|
IllegalArgumentException |
if firstTime.getTime() < 0 or period <= 0 |
IllegalStateException |
if task was already scheduled or cancelled, timer was cancelled, or timer thread terminated. |
NullPointerException |
if task or firstTime is null |