快速业务通道

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

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-17
确的状态转变 ―― 如保证 不对一个非 VIRGIN 状态的任务进行两次计划 ―― 增加了 Scheduler 和 SchedulerTask 类的复杂性。在进行可能改变任务状态的操作时,代码必须同步任务的锁对象。

在 Java 应用程序中计划重复执行的任务(6)

时间:2011-04-19 IBM Tom White

取消任务

取消计划任务有三种方式。第一种是调用 SchedulerTask 的 cancel() 方法。这很像调 用 TimerTask 的 cancel()方法:任务再也不会运行了,不过已经运行的任务仍会运行完成 。 cancel() 方法的返回值是一个布尔值,表示如果没有调用 cancel() 的话,计划的任务 是否还会运行。更准确地说,如果任务在调用 cancel() 之前是 SCHEDULED 状态,那么它就 返回 true。如果试图再次计划一个取消的(甚至是已计划的)任务,那么 Scheduler 就会 抛出一个 IllegalStateException。

取消计划任务的第二种方式是让 ScheduleIterator 返回 null。这只是第一种方式的简 化操作,因为 Scheduler 类调用 SchedulerTask 类的 cancel()方法。如果您想用迭代器而 不是任务来控制计划停止时间时,就用得上这种取消任务的方式了。

第三种方式是通过调用其 cancel() 方法取消整个 Scheduler。这会取消调试程序的所有 任务,并使它不能再计划任何任务。

扩展 cron 实用程序

可以将计划框架比作 UNIX 的 cron 实用程序,只不过计划次数的规定是强制性而不是声 明性的。例如,在 AlarmClock 实现中使用的 DailyIterator 类,它的计划与 cron 作业的 计划相同,都是由以 0 7 * * * 开始的 crontab 项指定的(这些字段分别指定分钟、小时 、日、月和星期)。

不过,计划框架比 cron 更灵活。想像一个在早晨打开热水的 HeatingController 应用 程序。我想指示它“在每个工作日上午 8:00 打开热水,在周未上午 9:00 打开热水”。使 用 cron,我需要两个 crontab 项(0 8 * * 1,2,3,4,5 和 0 9 * * 6,7)。而使用 ScheduleIterator 的解决方案更简洁一些,因为我可以使用复合(composition)来定义单 一迭代器。清单 7 显示了其中的一种方法:

清单 7. 用复合定义单一迭代器

int[] weekdays = new int[] {      Calendar.MONDAY,      Calendar.TUESDAY,      Calendar.WEDNESDAY,      Calendar.THURSDAY,      Calendar.FRIDAY    };    int[] weekend = new int[] {      Calendar.SATURDAY,      Calendar.SUNDAY    };    ScheduleIterator i = new CompositeIterator(      new ScheduleIterator[] {        new RestrictedDailyIterator(8, 0, 0, weekdays),        new RestrictedDailyIterator(9, 0, 0, weekend)      }    );

RestrictedDailyIterator 类很像 DailyIterator,只不过它限制为只在一周的特定日子 里运行,而一个 CompositeIterator 类取得一组 ScheduleIterators,并将日期正确排列到 单个计划中。这些类的源代码请参阅 参考资料。

有许多计划是 cron 无法生成的,但是 ScheduleIterator 实现却可以。例如,“每个月 的最后一天”描述的计划可以用标准 Java 日历算法来实现(用 Calendar 类),而用 cron 则无法表达它。应用程序甚至无需使用 Calendar 类。在本文的源代码(请参阅 参考资料) 中,我加入了一个安全灯控制器的例子,它按“在日落之前 15 分钟开灯”这一计划运行。 这个实现使用了 Calendrical Calculations Software Package (请参阅 参考资料),用 于计算当地(给定经度和纬度)的日落时间。

在 Java 应用程序中计划重复执行的任务(7)

时间:2011-04-19 IBM Tom White

实时保证

在编写使用计划的应用程序时,一定要了

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站: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号