Module  java.base
软件包  java.util

Class Timer



  • public class Timer
    extends Object
    线程调度任务以供将来在后台线程中执行的功能。 任务可以安排一次执行,或者定期重复执行。

    对应于每个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为并发计划任务的数量。

    实现注意事项:所有构造函数启动计时器线程。

    从以下版本开始:
    1.3
    另请参见:
    TimerTaskObject.wait(long)
    • 构造方法摘要

      构造方法  
      Constructor 描述
      Timer​()
      创建一个新的计时器。
      Timer​(boolean isDaemon)
      创建一个新的定时器,其相关线程可以指定为 run as a daemon
      Timer​(String name)
      创建一个新的定时器,其相关线程具有指定的名称。
      Timer​(String name, boolean isDaemon)
      创建一个新的定时器,其相关线程具有指定的名称,可以指定为 run as a daemon
    • 构造方法详细信息

      • Timer

        public Timer​()
        创建一个新的计时器。 相关联的线程不是 run as a daemon
      • Timer

        public Timer​(boolean isDaemon)
        创建一个新的定时器,其相关线程可以指定为run as a daemon 如果定时器将用于调度重复的“维护活动”,只要应用程序正在运行,但是不应该延长应用程序的使用寿命,则会调用守护线程。
        参数
        isDaemon - 如果关联的线程应该作为守护程序运行, isDaemon true。
      • Timer

        public Timer​(String name)
        创建一个新的定时器,其相关线程具有指定的名称。 相关联的线程不是 run as a daemon
        参数
        name - 相关线程的名称
        异常
        NullPointerException - 如果 name为空
        从以下版本开始:
        1.5
      • Timer

        public Timer​(String name,
                     boolean isDaemon)
        创建一个新的定时器,其相关线程具有指定的名称,可以指定为 run as a daemon
        参数
        name - 相关线程的名称
        isDaemon - 如果关联的线程应该作为守护进程运行, isDaemon true
        异常
        NullPointerException - 如果 name为空
        从以下版本开始:
        1.5
    • 方法详细信息

      • schedule

        public void schedule​(TimerTask task,
                             long delay)
        在指定的延迟之后安排指定的任务执行。
        参数
        task - 要安排的任务。
        delay - 执行任务之前以毫秒为单位的延迟。
        异常
        IllegalArgumentException - 如果 delay为负数,或 delay + System.currentTimeMillis()为负数。
        IllegalStateException - 如果任务已经被调度或取消,定时器被取消或定时器线程被终止。
        NullPointerException - 如果 task为空
      • schedule

        public void schedule​(TimerTask task,
                             Date time)
        在指定的时间安排指定的任务执行。 如果时间过去了,这个任务就被安排立即执行。
        参数
        task - 要安排的任务。
        time - 执行任务的时间。
        异常
        IllegalArgumentException - 如果 time.getTime()为负数。
        IllegalStateException - 如果任务已经被调度或取消,定时器被取消或定时器线程被终止。
        NullPointerException - 如果 tasktime为空
      • schedule

        public void schedule​(TimerTask task,
                             long delay,
                             long period)
        在指定的延迟之后开始,重新执行固定延迟执行的指定任务。 后续执行按照规定的时间间隔间隔进行。

        在固定延迟执行中,每个执行都相对于上一次执行的实际执行时间进行调度。 如果由于任何原因(如垃圾收集或其他背景活动)延迟执行,则后续执行也将被延迟。 从长远来看,执行频率通常会略低于指定期间的倒数(假设Object.wait(long)的系统时钟准确)。

        固定延迟执行适用于需要“平滑”的重复活动。 换句话说,适合在短期内保持频率准确的活动比从长远来看更为重要的活动。 这包括大多数动画任务,例如定期闪烁光标。 它还包括其中响应于人类输入执行常规活动的任务,例如只要按住键被自动重复一个字符。

        参数
        task - 要安排的任务。
        delay - 执行任务之前以毫秒为单位的延迟。
        period - 连续执行任务之间的时间(以毫秒为单位)。
        异常
        IllegalArgumentException - 如果是 delay < 0delay + System.currentTimeMillis() < 0period <= 0
        IllegalStateException - 如果任务已经被调度或取消,计时器被取消或定时器线程被终止。
        NullPointerException - 如果 task为空
      • schedule

        public void schedule​(TimerTask task,
                             Date firstTime,
                             long period)
        从指定的时间开始,对指定的任务执行重复的固定延迟执行 后续执行大约定期进行,间隔指定期间。

        在固定延迟执行中,每个执行都相对于上一次执行的实际执行时间进行调度。 如果由于任何原因(如垃圾收集或其他背景活动)延迟执行,则后续执行也将被延迟。 从长远来看,执行频率通常会略低于指定期间的倒数(假设Object.wait(long)的系统时钟准确)。 作为上述的结果,如果计划的第一次是过去的,则计划立即执行。

        固定延迟执行适用于需要“平滑”的重复活动。 换句话说,适合在短期内保持频率准确的活动比从长远来看更为重要的活动。 这包括大多数动画任务,例如定期闪烁光标。 它还包括其中响应于人类输入执行常规活动的任务,例如只要按住键被自动重复一个字符。

        参数
        task - 要安排的任务。
        firstTime - 第一次执行任务。
        period - 连续执行任务之间的时间(以毫秒为单位)。
        异常
        IllegalArgumentException - 如果是 firstTime.getTime() < 0 ,或者是 period <= 0
        IllegalStateException - 如果任务已经被调度或取消,定时器被取消或定时器线程被终止。
        NullPointerException - 如果 taskfirstTime为空
      • scheduleAtFixedRate

        public void scheduleAtFixedRate​(TimerTask task,
                                        long delay,
                                        long period)
        在指定的延迟之后开始,重新执行固定速率的指定任务。 后续执行大约定期进行,间隔指定期间。

        在固定速率执行中,相对于初始执行的预定执行时间调度每个执行。 如果由于任何原因(例如垃圾收集或其他背景活动)延迟执行,则两次或多次执行将快速连续发生以“追赶”。 从长远来看,执行的频率将恰好是指定周期的倒数(假设Object.wait(long)的系统时钟准确)。

        固定速率执行适用于对绝对时间敏感的重复活动,例如每小时敲响一次钟声,或在特定时间每天运行定期维护。 对于执行固定次数的执行的总时间很重要的循环活动也是适用的,例如每秒钟打10秒钟的倒数计时器。 最后,固定速率执行适用于调度必须相对于彼此保持同步的多个重复定时器任务。

        参数
        task - 要安排的任务。
        delay - 执行任务之前以毫秒为单位的延迟。
        period - 连续执行任务之间的时间(以毫秒为单位)。
        异常
        IllegalArgumentException - 如果是 delay < 0delay + System.currentTimeMillis() < 0period <= 0
        IllegalStateException - 如果任务已经被调度或取消,定时器被取消或定时器线程被终止。
        NullPointerException - 如果 task为空
      • scheduleAtFixedRate

        public void scheduleAtFixedRate​(TimerTask task,
                                        Date firstTime,
                                        long period)
        从指定的时间开始,对指定的任务执行重复的固定速率执行 后续执行大约定期进行,间隔指定期间。

        在固定速率执行中,相对于初始执行的预定执行时间调度每个执行。 如果由于任何原因(例如垃圾收集或其他背景活动)延迟执行,则两次或多次执行将快速连续发生以“追赶”。 从长远来看,执行频率将恰好是指定周期的倒数(假设系统时钟为Object.wait(long) )。 由于上述原因,如果计划的第一次是过去,那么任何“错过”的处决将被安排在立即的“追赶”执行之中。

        固定速率执行适用于对绝对时间敏感的重复活动,例如每小时敲响一次钟声,或在特定时间每天运行定期维护。 对于执行固定次数的执行的总时间很重要的循环活动也是适用的,例如每秒钟打10秒钟的倒数计时器。 最后,固定速率执行适用于调度必须相对于彼此保持同步的多个重复定时器任务。

        参数
        task - 要安排的任务。
        firstTime - 第一次执行任务。
        period - 连续执行任务之间的时间(以毫秒为单位)。
        异常
        IllegalArgumentException - 如果是 firstTime.getTime() < 0period <= 0
        IllegalStateException - 如果任务已经被调度或取消,定时器被取消或定时器线程被终止。
        NullPointerException - 如果 taskfirstTime为空
      • cancel

        public void cancel​()
        终止此计时器,丢弃任何当前计划的任务。 不干扰当前执行的任务(如果存在)。 一旦计时器被终止,它的执行线程就会顺利地终止,并且不会再安排任务了。

        请注意,在此定时器调用的定时器任务的运行方法内调用此方法绝对保证正在进行的任务执行是该定时器将执行的最后一个任务执行。

        这个方法可以重复调用; 第二个和以后的呼叫没有任何效果。

      • purge

        public int purge​()
        从该计时器的任务队列中删除所有取消的任务。 调用此方法对定时器的行为没有影响 ,但是消除了对队列中已取消任务的引用。 如果没有对这些任务的外部引用,它们就有资格进行垃圾收集。

        大多数程序将无需调用此方法。 它被设计用于取消大量任务的罕见应用程序使用。 调用此方法可以占用空间:方法的运行时间可能与n + c log n成正比,其中n是队列中任务的数量,c是已取消任务的数量。

        请注意,可以从在此定时器上调度的任务中调用此方法。

        结果
        从队列中删除的任务数。
        从以下版本开始:
        1.5