public class Timer extends Object
对应于每个Timer对象是单个后台线程,用于依次执行所有定时器的所有任务。 计时器任务应该快速完成。 如果一个定时器任务需要花费很多时间来完成,它会“计时”计时器的任务执行线程。 这可能会延迟随后的任务的执行,这些任务在(和)如果违规任务最后完成时,可能会“束起来”并快速执行。
在最后一次对Timer对象的引用后,所有未完成的任务已完成执行,定时器的任务执行线程正常终止(并被收集到垃圾回收)。 但是,这可能需要任意长时间的发生。 默认情况下,任务执行线程不作为守护程序线程运行,因此它能够使应用程序终止。 如果主叫方想要快速终止定时器的任务执行线程,则调用者应该调用定时器的cancel方法。
如果定时器的任务执行线程意外终止,例如,因为它调用了stop方法,那么在计时器上安排任务的任何进一步的尝试将会产生一个IllegalStateException ,就像定时器的cancel方法被调用一样。
这个类是线程安全的:多个线程可以共享一个单独的Timer对象,而不需要外部同步。
此类不提供实时保证:使用Object.wait(long)方法是调度任务。
Java 5.0引入了java.util.concurrent
软件包,其中一个java.util.concurrent
程序是ScheduledThreadPoolExecutor
,它是用于以给定速率或延迟重复执行任务的线程池。 这实际上是对一个更灵活的替代Timer
/ TimerTask
组合,因为它允许多个服务线程,接受各种时间单位,并且不需要子类TimerTask
(只实现Runnable
)。 使用一个线程配置ScheduledThreadPoolExecutor
使其等同于Timer
。
实现注意事项:这个类可以扩展到大量并发计划任务(千应该没有问题)。 在内部,它使用二进制堆表示其任务队列,因此计划任务的成本为O(log n),其中n为并发计划任务的数量。
实现注意事项:所有构造函数启动计时器线程。
TimerTask
, Object.wait(long)
Constructor and Description |
---|
Timer()
创建一个新的计时器。
|
Timer(boolean isDaemon)
创建一个新的定时器,其相关线程可以指定为
run as a daemon 。
|
Timer(String name)
创建一个新的定时器,其相关线程具有指定的名称。
|
Timer(String name, boolean isDaemon)
创建一个新的定时器,其相关线程具有指定的名称,可以指定为
run as a daemon 。
|
Modifier and Type | Method and Description |
---|---|
void |
cancel()
终止此计时器,丢弃任何当前计划的任务。
|
int |
purge()
从该计时器的任务队列中删除所有取消的任务。
|
void |
schedule(TimerTask task, Date time)
在指定的时间安排指定的任务执行。
|
void |
schedule(TimerTask task, Date firstTime, long period)
从指定
的时间开始 ,对指定的任务执行重复的
固定延迟执行 。
|
void |
schedule(TimerTask task, long delay)
在指定的延迟之后安排指定的任务执行。
|
void |
schedule(TimerTask task, long delay, long period)
在指定
的延迟之后开始 ,重新执行
固定延迟执行的指定任务。
|
void |
scheduleAtFixedRate(TimerTask task, Date firstTime, long period)
从指定的时间
开始 ,对指定的任务执行重复的
固定速率执行 。
|
void |
scheduleAtFixedRate(TimerTask task, long delay, long period)
在指定的延迟之后
开始 ,重新执行
固定速率的指定任务。
|
public Timer()
public Timer(boolean isDaemon)
isDaemon
- 如果关联的线程应该作为守护进程运行,则为true。
public Timer(String name)
name
- 相关线程的名称
NullPointerException
- 如果
name
为空
public Timer(String name, boolean isDaemon)
name
- 相关线程的名称
isDaemon
- 如果关联的线程应该作为守护程序运行,则为true
NullPointerException
- 如果
name
为空
public void schedule(TimerTask task, long delay)
task
- 要安排的任务。
delay
- 执行任务之前以
delay
为单位的延迟。
IllegalArgumentException
- 如果
delay为负数,或
delay + System.currentTimeMillis()为负数。
IllegalStateException
- 如果任务已经被调度或取消,定时器被取消或定时器线程被终止。
NullPointerException
- 如果
task
为空
public void schedule(TimerTask task, Date time)
task
- 要安排的任务。
time
- 执行任务的时间。
IllegalArgumentException
- 如果
time.getTime()为负数。
IllegalStateException
- 如果任务已经被调度或取消,定时器被取消或定时器线程被终止。
NullPointerException
- 如果
task
或
time
为空
public void schedule(TimerTask task, long delay, long period)
在固定延迟执行中,每个执行都相对于上一次执行的实际执行时间进行调度。 如果由于任何原因(如垃圾收集或其他背景活动)延迟执行,则后续执行也将被延迟。 从长远来看,执行频率通常比指定的周期(假定系统时钟基本Object.wait(long)是准确)的倒数略低。
固定延迟执行适用于需要“平滑”的重复活动。 换句话说,适合在短期内保持频率准确的活动比从长远来看更为重要的活动。 这包括大多数动画任务,例如定期闪烁光标。 它还包括其中响应于人类输入执行常规活动的任务,例如只要按住键被自动重复一个字符。
task
- 要安排的任务。
delay
- 执行任务之前以
delay
为单位的延迟。
period
- 连续执行任务之间的时间(以毫秒为单位)。
IllegalArgumentException
- 如果是
delay < 0
或
delay + System.currentTimeMillis() < 0
或
period <= 0
IllegalStateException
- 如果任务已经被调度或取消,定时器被取消或定时器线程被终止。
NullPointerException
- 如果
task
为空
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
为空
public void scheduleAtFixedRate(TimerTask task, long delay, long period)
在固定速率执行中,相对于初始执行的预定执行时间调度每个执行。 如果由于任何原因(例如垃圾收集或其他背景活动)延迟执行,则两次或多次执行将快速连续发生以“追赶”。 从长远来看,执行的频率将是完全可逆的规定期间(假设系统时钟基本Object.wait(long)是准确)的。
固定速率执行适用于对绝对时间敏感的重复活动,例如每小时敲响一次钟声,或在特定时间每天运行定期维护。 对于执行固定次数的执行的总时间很重要的循环活动也是适用的,例如每秒钟打10秒钟的倒数计时器。 最后,固定速率执行适用于调度必须相对于彼此保持同步的多个重复定时器任务。
task
- 要安排的任务。
delay
- 执行任务之前以
delay
为单位的延迟。
period
- 连续执行任务之间的毫秒数。
IllegalArgumentException
- 如果
delay < 0
或
delay + System.currentTimeMillis() < 0
或
period <= 0
IllegalStateException
- 如果任务已经被调度或取消,定时器被取消或定时器线程被终止。
NullPointerException
- 如果
task
为空
public void scheduleAtFixedRate(TimerTask task, Date firstTime, long period)
在固定速率执行中,相对于初始执行的预定执行时间调度每个执行。 如果由于任何原因(例如垃圾收集或其他背景活动)延迟执行,则两次或多次执行将快速连续发生以“追赶”。 从长远来看,执行的频率将是完全可逆的规定期间(假设系统时钟基本Object.wait(long)是准确)的。 由于上述原因,如果计划的第一次是过去,那么任何“错过”的处决将被安排在立即的“追赶”执行之中。
固定速率执行适用于对绝对时间敏感的重复活动,例如每小时敲响一次钟声,或在特定时间每天运行定期维护。 对于执行固定次数的执行的总时间很重要的循环活动也是适用的,例如每秒钟打10秒钟的倒数计时器。 最后,固定速率执行适用于调度必须相对于彼此保持同步的多个重复定时器任务。
task
- 要安排的任务。
firstTime
- 第一次执行任务。
period
- 连续执行任务之间的时间(以毫秒为单位)。
IllegalArgumentException
- 如果是
firstTime.getTime() < 0
或
period <= 0
IllegalStateException
- 如果任务已经被调度或取消,定时器被取消或定时器线程被终止。
NullPointerException
- 如果
task
或
firstTime
为null
public void cancel()
请注意,在此定时器调用的定时器任务的运行方法内调用此方法绝对保证正在进行的任务执行是该定时器将执行的最后一个任务执行。
这个方法可以重复调用; 第二个和以后的呼叫没有任何效果。
public int purge()
大多数程序将无需调用此方法。 它被设计用于少量应用程序使用,可以取消大量的任务。 调用此方法可以占用空间:方法的运行时间可能与n + c log n成正比,其中n是队列中任务的数量,c是已取消任务的数量。
请注意,可以在此定时器上调度的任务内调用此方法。