帮助文档 | JDK 1.8 中的 Timer 类

1 Class Timer

定时器 Timer 类位于java.util包,并且继承自根类 Object,具体为:

  • public class Timer extends Object

线程调度任务是可以在后台线程中执行的能力。任务可以执行一次,也可以定期重复执行。

与每个 Timer 对象相对应的是一个单独的后台线程,它用于顺序执行所有定时器的任务。定时器任务应该很快完成。如果一个计时器任务花费了大量的时间来完成,它会“影响”计时器的任务执行线程。同时,反过来,延迟执行子序列的任务,当(或如果)延迟任务最终完成的时候,这些任务可能会“串联”并迅速执行。

在对 Timer 对象的最后一次实时引用消失后,所有未完成的任务都已完成执行,计时器任务的执行线程将优雅地终止(并成为垃圾收集的对象)。然而,垃圾回收器可能在任意长的时间内回收垃圾对象(换言之,不知道垃圾回收器什么时候会执行,或者会不会执行,例如,如果内存空间足够的话,垃圾回收器可能一直不执行)。默认情况下,任务执行线程不作为守护线程运行,因此它能够使应用程序终止。如果我们想要快速终止定时器的任务执行线程,我们应该调用计时器的cancel方法。

如果定时器的任务执行线程意外终止,例如,因为它调用了stop方法,那么在定时器上调度任务的任何进一步的尝试都将会产生一个 IllegalStateException,就像定时器的cancel方法被调用一样。

这个类(Timer)是线程安全的:多个线程可以共享一个 Timer 对象,而不需要外部同步。

这个类(Timer)不提供实时保证:使用Object.wait(long)方法是调度任务。

Java 5.0 引入了java.util.concurrent包,其中一个并发工具是 ScheduledThreadPoolExecutor,它用于以给定速率或延迟重复执行任务的线程池。这实际上是一个更灵活的替代 Timer / TimerTask 组合,因为它允许多个服务线程,接受各种时间单位,并且不需要子类 TimerTask(仅实现 Runnable 接口)。在一个线程上配置 ScheduledThreadPoolExecutor 等同于使用 Timer 类。

  • 实现注意事项:这个类可以扩展到大量并发调度的任务(数千应该没有问题)。在内部,它使用二进制堆表示其任务队列,因此计划任务的成本为O(logn),其中n为并发计划调度任务的数量。
  • 实现注意事项:所有构造函数启动定时器线程。

起始版本:1.3

2 概要

2.1 构造方法概要

  • Timer():创建一个新的定时器。
  • Timer(boolean isDaemon):创建一个新的定时器,其关联线程可以作为守护进程运行。
  • Timer(String name):创建一个新的定时器,其关联线程具有指定的名称。
  • Timer(String name, boolean isDaemon):创建一个新的定时器,其关联线程具有指定的名称,并且可以指定其关联进程是否作为守护进程运行。

2.1 方法概要

  • 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):在经过指定的延迟时间之后,执行指定的任务,并以固定的时间周期重复执行指定的任务。

你可能感兴趣的:(帮助文档 | JDK 1.8 中的 Timer 类)