`
fengshujuan
  • 浏览: 160737 次
  • 性别: Icon_minigender_2
  • 来自: 北京
社区版块
存档分类
最新评论

定时器的选择:timer or quartz?

阅读更多

公司需要做一个表单定时任务,定时器,能想到的有两个 java.util.Timer 和quartz

 

先看一下java.util.Timer。

一种线程设施,用于安排以后在后台线程中执行的任务。可安排任务执行一次,或者定期重复执行。

与每个 Timer 对象相对应的是单个后台线程,用于顺序地执行所有计时器任务。计时器任务应该迅速完成。如果完成某个计时器任务的时间太长,那么它会“独占”计时器的任务 执行线程。因此,这就可能延迟后续任务的执行,而这些任务就可能“堆在一起”,并且在上述令人讨厌的任务最终完成时才能够被快速连续地执行。

Timer 对象最后的引用完成后,并且 所有未处理的任务都已执行完成后,计时器的任务执行线程会正常终止(并且成为垃圾回收的对象)。但是这可能要很长时间后才发生。默认情况下,任务执行线程并不作为守护线程 来运行,所以它能够阻止应用程序终止。如果调用方想要快速终止计时器的任务执行线程,那么调用方应该调用计时器的 cancel 方法。

如果意外终止了计时器的任务执行线程,例如调用了它的 stop 方法,那么所有以后对该计时器安排任务的尝试都将导致 IllegalStateException ,就好像调用了计时器的 cancel 方法一样。

此类是线程安全的:多个线程可以共享单个 Timer 对象而无需进行外部同步。

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

实现注意事项:此类可扩展到大量同时安排的任务(存在数千个都没有问题)。在内部,它使用二进制堆来表示其任务队列,所以安排任务的开销是 O(log n),其中 n 是同时安排的任务数。

更多细节请参考java api

 

它一个很大的缺点是:不够灵活。只能执行一次,或者定期重复执行。例如说:每周二执行,每隔两个执行,每三个月执行。他不能支持:每周二的周四和周五执行,偶数月的最后一个星期的周四执行等。

 

相对而言,quartz足够灵活:

Quartz是一个任务日程管理系统,“任务进度管理器”就是一个在预先确定(被纳入日程)的时间到达时,负责执行(或者通知)其他软件组件的系统。

quartz的任务日程安排相当灵活,任务在给定的触发器(Trigger)触发时执行。触发器可以通过几乎以下所有形式的组合方式进行创建:

  • 在一天中的任意时刻(可以精确到毫秒)。
  • 一周中特定的一些天。
  • 一个月中特定的一些天。
  • 一年中特定的一些天
  • 不在日历列表中注册的一些天(比如节假日)。循环特定的次数。
  • 循环到特定的时间。
  • 无限循环。
  • 按照一定的时间间隔循环。

 

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics