树叶云鸿蒙OS教程:鸿蒙OS Timer

Timer

java.lang.Object

|—java.util.Timer

public class Timer
extends Object

线程调度任务以供将来在后台线程中执行的工具。 任务可以安排为一次性执行,或定期重复执行。

对应于每个 Timer 对象的是单个后台线程,用于按顺序执行所有计时器的任务。 定时器任务应该很快完成。 如果一个定时器任务花费了过多的时间来完成,它就会“占用”定时器的任务执行线程。 反过来,这可以延迟后续任务的执行,这些任务可能会在(如果)有问题的任务最终完成时“聚集”并快速连续执行。

在对 Timer 对象的最后一个实时引用消失并且所有未完成的任务都已完成执行后,计时器的任务执行线程优雅地终止(并成为垃圾回收的对象)。 但是,这可能需要任意长的时间才能发生。 默认情况下,任务执行线程不作为守护线程运行,因此它能够防止应用程序终止。 如果调用者想要快速终止定时器的任务执行线程,调用者应该调用定时器的取消方法。

如果计时器的任务执行线程意外终止,例如,因为调用了它的 stop 方法,那么任何进一步尝试在计时器上安排任务都将导致 IllegalStateException,就像调用了计时器的取消方法一样。

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

此类不提供实时保证:它使用 Object.wait(long) 方法安排任务。

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

实施说明:此类可扩展到大量并发计划任务(数千个应该没有问题)。 在内部,它使用二进制堆来表示其任务队列,因此调度任务的成本为 O(log n),其中 n 是并发调度的任务数。

实现说明:所有构造函数都启动一个计时器线程。

构造函数摘要

构造函数描述
Timer()创建一个新的计时器。
Timer(boolean isDaemon)创建一个新的计时器,其关联线程可以指定给 Thread#setDaemon。
Timer(String name)创建一个新的计时器,其关联线程具有指定的名称。
Timer(String name, boolean isDaemon)创建一个新的计时器,其关联线程具有指定的名称,并且可以指定给 Thread#setDaemon。

方法总结

修饰符和类型方法描述
voidcancel()终止此计时器,丢弃任何当前计划的任务。
intpurge()从此计时器的任务队列中删除所有已取消的任务。
voidschedule(TimerTask task, long delay)安排指定任务在指定延迟后执行。
voidschedule(TimerTask task, long delay, long period)安排指定任务以重复固定延迟执行,在指定延迟后开始。
voidschedule(TimerTask task, Date time)安排指定任务在指定时间执行。
voidschedule(TimerTask task, Date firstTime, long period)从指定时间开始,安排指定任务以重复固定延迟执行。
voidscheduleAtFixedRate(TimerTask task, long delay, long period)安排指定任务以重复固定速率执行,在指定延迟后开始。
voidscheduleAtFixedRate(TimerTask task, Date firstTime, long period)从指定时间开始,安排指定任务以重复固定速率执行。
从类 java.lang.Object 继承的方法
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait

构造函数详细信息

Timer

public Timer()

创建一个新的计时器。 关联的线程没有 Thread#setDaemon。

Timer

public Timer(boolean isDaemon)

创建一个新的计时器,其关联线程可以指定给 Thread#setDaemon。 如果计时器将用于安排重复的“维护活动”,则调用守护线程,只要应用程序正在运行,就必须执行该活动,但不应延长应用程序的生命周期。

参数:

参数名称参数描述
isDaemon如果关联的线程应该作为守护进程运行,则为 true。

Timer

public Timer(String name)

创建一个新的计时器,其关联线程具有指定的名称。 关联的线程没有 Thread#setDaemon。

参数:

参数名称参数描述
name关联线程的名称

Throws:

Throw名称Throw描述
NullPointerException如果 name 为空

Timer

public Timer(String name, boolean isDaemon)

创建一个新的计时器,其关联线程具有指定的名称,并且可以指定给 Thread#setDaemon。

参数:

参数名称参数描述
name关联线程的名称
isDaemon如果关联的线程应该作为守护进程运行,则为 true

Throws:

Throw名称Throw描述
NullPointerException如果 name 为空

方法详情

schedule

public void schedule(TimerTask task, long delay)

安排指定任务在指定延迟后执行。

参数:

参数名称参数描述
task要安排的任务。
delay任务执行前的延迟毫秒数。

Throws:

Throw名称Throw描述
IllegalArgumentException如果延迟为负,或延迟 + System.currentTimeMillis() 为负。
IllegalStateException如果任务已被安排或取消,定时器被取消,或定时器线程终止。
NullPointerException如果任务为空

schedule

public void schedule(TimerTask task, Date time)

安排指定任务在指定时间执行。 如果时间是过去,则安排任务立即执行。

参数:

参数名称参数描述
task要安排的任务。
time执行任务的时间。

Throws:

Throw名称Throw描述
IllegalArgumentException如果 time.getTime() 是负数。
IllegalStateException如果任务已被安排或取消,定时器被取消,或定时器线程终止。
NullPointerException如果任务或时间为空

schedule

public void schedule(TimerTask task, long delay, long period)

安排指定任务以重复固定延迟执行,在指定延迟后开始。 随后的执行以大约固定的时间间隔进行,间隔指定的时间段。

在固定延迟执行中,每次执行都是相对于前一次执行的实际执行时间安排的。 如果由于任何原因(例如垃圾收集或其他后台活动)延迟执行,则后续执行也会延迟。 从长远来看,执行频率一般会略低于指定周期的倒数(假设系统时钟底层 Object.wait(long) 是准确的)。

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

参数:

参数名称参数描述
task要安排的任务。
delay任务执行前的延迟毫秒数。
period连续任务执行之间的时间(以毫秒为单位)。

Throws:

Throw名称Throw描述
IllegalArgumentException如果延迟 < 0,或延迟 + System.currentTimeMillis() < 0,或周期 <= 0
IllegalStateException如果任务已被安排或取消,定时器被取消,或定时器线程终止。
NullPointerException如果任务为空

schedule

public void schedule(TimerTask task, Date firstTime, long period)

从指定时间开始,安排指定任务以重复固定延迟执行。 随后的执行以大约固定的时间间隔进行,间隔指定的时间段。

在固定延迟执行中,每次执行都是相对于前一次执行的实际执行时间安排的。 如果由于任何原因(例如垃圾收集或其他后台活动)延迟执行,则后续执行也会延迟。 从长远来看,执行频率一般会略低于指定周期的倒数(假设系统时钟底层 Object.wait(long) 是准确的)。 作为上述的结果,如果预定的第一次是过去的,则预定立即执行。

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

参数:

参数名称参数描述
task要安排的任务。
firstTime第一次执行哪个任务。
period连续任务执行之间的时间(以毫秒为单位)。

Throws:

Throw名称Throw描述
IllegalArgumentException如果 firstTime.getTime() < 0,或 period <= 0
IllegalStateException如果任务已被安排或取消,定时器被取消,或定时器线程终止。
NullPointerException如果 task 或 firstTime 为 null

scheduleAtFixedRate

public void scheduleAtFixedRate(TimerTask task, long delay, long period)

安排指定任务以重复固定速率执行,在指定延迟后开始。 随后的执行以大约固定的时间间隔进行,间隔指定的时间段。

在固定速率执行中,每次执行都是相对于初始执行的计划执行时间安排的。 如果由于任何原因(例如垃圾收集或其他后台活动)延迟了执行,则会快速连续发生两次或更多执行以“赶上”。 从长远来看,执行频率将恰好是指定周期的倒数(假设 Object.wait(long) 底层的系统时钟是准确的)。

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

参数:

参数名称参数描述
task要安排的任务。
delay任务执行前的延迟毫秒数。
period连续任务执行之间的时间(以毫秒为单位)。

Throws:

Throw名称Throw描述
IllegalArgumentException如果延迟 < 0,或延迟 + System.currentTimeMillis() < 0,或周期 <= 0
IllegalStateExceptionif task was already scheduled or cancelled, timer was cancelled, or timer thread terminated.
NullPointerExceptionif task is null

scheduleAtFixedRate

public void scheduleAtFixedRate(TimerTask task, Date firstTime, long period)

从指定时间开始,安排指定任务以重复固定速率执行。 随后的执行以大约固定的时间间隔进行,间隔指定的时间段。

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

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

参数:

参数名称参数描述
task要安排的任务。
firstTime第一次执行哪个任务。
period连续任务执行之间的时间(以毫秒为单位)。

Throws:

Throw名称Throw描述
IllegalArgumentException如果 firstTime.getTime() < 0 或 period <= 0
IllegalStateException如果任务已被安排或取消,定时器被取消,或定时器线程终止。
NullPointerException如果 task 或 firstTime 为 null

cancel

public void cancel()

终止此计时器,丢弃任何当前计划的任务。 不干扰当前正在执行的任务(如果存在)。 一旦定时器被终止,它的执行线程就会优雅地终止,并且不能在其上安排更多的任务。

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

该方法可能会被重复调用; 第二次和后续调用无效。

purge

public int purge()

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

大多数程序不需要调用这个方法。 它专为取消大量任务的罕见应用程序而设计。 调用此方法是以时间换空间:该方法的运行时间可能与 n + c log n 成正比,其中 n 是队列中的任务数,c 是取消的任务数。

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

返回:

从队列中删除的任务数。

文章来源网络,作者:管理,如若转载,请注明出处:https://shuyeidc.com/wp/171284.html<

赞 (0)
管理的头像管理
上一篇2025-03-22 19:09
下一篇 2025-03-22 19:11

相关推荐

  • jsp空间购买和交换数据空间怎么买,有哪些注意事项?

    购买JSP空间时,是否考虑过数据交换空间的性能?简米科技(2003年始创,23年行业沉淀)与酷番云(工信部一类增值电信全牌照)这类持牌自营机房的服务商,能确保数据交换的高效稳定,是值得优先选择的合作伙伴,为什么JSP空间需要搭配独立的数据交换空间从JSP应用特性看数据交换需求JSP基于Java技术,常用于企业级……

    2026-08-11
    0
  • 建网站用香港空间效果怎么样,香港空间稳定吗?

    建网站用香港空间,对于创建网站资产来说,核心价值在于免备案和全球带宽优势,尤其适合外贸、跨境电商和需要快速启动的项目,但你必须权衡国内访问延迟,并选择有资质的服务商以保证资产安全,香港空间的核心优势与适用边界免备案:节省时间就是节省成本国内服务器需要备案,通常需要10到20天,香港空间无需备案,域名解析后即可上……

    2026-08-11
    0
  • Java连接云数据库的方法是什么,如何操作

    Java连接云数据库的核心在于通过JDBC驱动,结合云服务商提供的连接地址、端口、数据库名及认证信息,配置安全策略(如SSL、IP白名单),即可实现稳定高效的远程数据库访问,基础准备:JDBC驱动与依赖管理连接云数据库前,需要确保开发环境具备对应的JDBC驱动,以最常见的MySQL为例,你需要引入mysql-c……

    2026-08-11
    0
  • 建网站公安联网备案必须使用数据码吗,备案流程是什么

    网站备案包括ICP备案和公安联网备案,两者缺一不可,公安联网备案必须使用服务商提供的数据码,选择持有合法资质的服务商是顺利通过备案的前提,为什么网站必须进行公安联网备案根据公安部《计算机信息网络国际联网安全保护管理办法》,网站开通后30日内必须到公安机关办理备案手续,未完成公安备案的网站,面临责令整改、关闭网站……

    2026-08-10
    0
  • 建一个企业网站大概需要多少钱?,怎么收费?

    建网站要多少钱,没有一个固定的数字,几百到几万都可能,但真正的“创建网站资产”绝不仅仅是初次投入的成本,而是基于长期稳定、合规和安全的持续性投入,其中核心取决于你选择了什么样的“地基”来承载你的业务,建站预算的构成与行业基准当你开始规划一个网站,最先面对的就是预算问题,一个常见的误区是只关注网站“看起来”的建造……

    2026-08-10
    0

发表回复

您的邮箱地址不会被公开。必填项已用 * 标注