模块  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)
    • 构造方法摘要

      构造方法  
      构造器 描述
      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 < 0 ,或 delay + System.currentTimeMillis() < 0 ,或 period <= 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)是准确的)。

        固定费率执行适用于对绝对时间敏感的重复活动,例如每小时每小时响铃,或者在特定时间每天运行定期维护。 它也适用于重复活动,其中执行固定执行次数的总时间很重要,例如倒数计时器,每秒钟滴答一次,持续十秒钟。 最后,固定速率执行适用于调度必须保持彼此同步的多个重复计时器任务。

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

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

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

        固定费率执行适用于对绝对时间敏感的重复活动,例如每小时每小时响铃,或者在特定时间每天运行定期维护。 它也适用于重复活动,其中执行固定执行次数的总时间很重要,例如倒数计时器,每秒钟滴答一次,持续十秒钟。 最后,固定速率执行适用于调度必须保持彼此同步的多个重复计时器任务。

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

        public void cancel()
        终止此计时器,丢弃当前计划的任何任务。 不会干扰当前正在执行的任务(如果存在)。 一旦计时器终止,其执行线程将正常终止,并且不再可以在其上安排任何任务。

        请注意,在此计时器调用的计时器任务的run方法中调用此方法绝对可以保证正在进行的任务执行是此计时器将执行的最后一次任务执行。

        可以重复调用该方法; 第二次和后续的通话都没有效果。

      • purge

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

        大多数程序都不需要调用此方法。 它被设计用于取消大量任务的罕见应用程序。 调用此方法会交换空间时间:方法的运行时间可能与n + c log n成比例,其中n是队列中的任务数,c是已取消任务的数量。

        请注意,允许在此计时器上安排的任务中调用此方法。

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