快速业务通道

在 Java 应用程序中计划重复执行的任务 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-17
解框架在时间方面有什么保证。我的任务是提前 还是延迟执行?如果有提前或者延迟,偏差最大值是多少?不幸的是,对这些问题没有简单 的答案。不过在实际中,它的行为对于很多应用程序已经足够了。下面的讨论假设系统时钟 是正确的(有关网络时间协议(Network Time Protocol)的信息,请参阅 参考资料)。

因为 Scheduler 将计划委托给 Timer 类,Scheduler 可以做出的实时保证与 Timer 的 一样。Timer 用 Object.wait(long) 方法计划任务。当前线程要等待直到唤醒它,唤醒可能 出于以下原因之一:

另一个线程调用对象的 notify() 或者 notifyAll() 方法。

线程被另一个线程中断。

在没有通知的情况下,线程被唤醒(称为 spurious wakeup,Joshua Bloch 的 Effective Java Programming Language Guide 一书中 Item 50 对其进行了描述 ―― 请参 阅 参考资料)。

规定的时间已到。

对于 Timer 类来说,第一种可能性是不会发生的,因为对其调用 wait() 的对象是私有 的。即便如此,Timer 实现仍然针对前三种提前唤醒的原因进行了保护,这样保证了线程在 规定时间后才唤醒。目前,Object.wait(long) 的文档注释声明,它会在规定的时间“前后 ”苏醒,所以线程有可能提前唤醒。在本例中,Timer 会让另一个 wait() 执行 (scheduledExecutionTime - System.currentTimeMillis())毫秒,从而保证任务永远不会 提前执行。

任务是否会延迟执行呢?会的。延迟执行有两个主要原因:线程计划和垃圾收集。

Java 语言规范故意没有对线程计划做严格的规定。这是因为 Java 平台是通用的,并针 对于大范围的硬件及其相关的操作系统。虽然大多数 JVM 实现都有公平的线程调度程序,但 是这一点没有任何保证 —— 当然,各个实现都有不同的为线程分配处理器时间的策略。因 此,当 Timer 线程在分配的时间后唤醒时,它实际执行其任务的时间取决于 JVM 的线程计 划策略,以及有多少其他线程竞争处理器时间。因此,要减缓任务的延迟执行,应该将应用 程序中可运行的线程数降至最少。为了做到这一点,可以考虑在一个单独的 JVM 中运行调度 程序。

对于创建大量对象的大型应用程序,JVM 花在垃圾收集(GC)上的时间会非常多。默认情 况下,进行 GC 时,整个应用程序都必须等待它完成,这可能要有几秒钟甚至更长的时间 (Java 应用程序启动器的命令行选项 -verbose:gc 将导致向控制台报告每一次 GC 事件) 。要将这些由 GC 引起的暂停(这可能会影响快速任务的执行)降至最少,应该将应用程序 创建的对象的数目降至最低。同样,在单独的 JVM 中运行计划代码是有帮助的。同时,可以 试用几个微调选项以尽可能地减少 GC 暂停。例如,增量 GC 会尽量将主收集的代价分散到 几个小的收集上。当然这会降低 GC 的效率,但是这可能是时间计划的一个可接受的代价( 有关 GC 微调的更多提示,请参阅 参考资料)。

我被计划到什么时候?

如果任务本身能监视并记录所有延迟执行的实例,那么对于确定任务是否能按时运行会很 有帮助。SchedulerTask 类似于 TimerTask,有一个 scheduledExecutionTime() 方法,它 返回计划任务最近一次执行的时间。在任务的 run() 方法开始时,对表达式 System.currentTimeMillis() - scheduledExecutionTime() 进行判断,可以让您确定任务 延迟了多久执行(以毫秒为单位)。可以记录这个值,以便生成一个关于延迟执行的分布统 计。可以用这个值决定任务应当采取什么动作 ―― 例如,如果任务太迟了,那么它可能什 么也不做。

结束语

在本文中,我介绍了 Java 定时器框架的一个简单增强,它使得灵活的计划策略成为可能 。新的框架实质上是更通用的 cron ―― 事实上,将 cron 实现为一个 ScheduleIterator 接口,用以

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号