51代码网ORACLEMYSQLSQL SERVER其它数据库java/jspasp/asp.netC/C++/VC++APP应用其它语言服务器应用
您现在的位置: 51代码网 >> java >> 文章正文

Java定时任务总结

更新时间:2012-2-15:  来源:51代码网

1. 使用现有框架,比如Quartz;

2. 使用ScheduledThreadPoolExecutor 调度定时任务;

3. 使用Timer 调度定时任务; 
第一种使用框架就不多做解释啦,简单好用,在大中型项目中是首选;

Timer的主要方法有:
// 安排在指定的时间执行
void schedule(TimerTask task, Date time)
// 安排在指定的时间开始以重复的延时执行
void schedule(TimerTask task, Date firstTime, long period)
// 安排在指定的延迟后执行
void schedule(TimerTask task, long delay)
// 安排在指定的延迟后开始以重复的延时执行
void schedule(TimerTask task, long delay, long period)
// 安排在指定的时间开始以重复的速率执行
void scheduleAtFixedRate(TimerTask task, Date firstTime, long period)
// 安排在指定的延迟后开始以重复的速率执行
void scheduleAtFixedRate(TimerTask task, long delay, long period)
注:重复的延时和重复的速率的区别在于,前者是在前一个任务的执行结束后间隔period时间再开始下一次执行;而scheduleAtFixedRate则是会尽量按照任务的初始时间来按照间隔period时间执行。如果一次任务执行由于某些原因被延迟了,用schedule()调度的后续任务同样也会被延迟,而用scheduleAtFixedRate()则会快速的开始两次或者多次执行,是后续任务的执行时间能够赶上来。


ScheduledThreadPoolExecutor的主要方法:

// 在指定的延迟后执行
<V>ScheduledFuture<V> schedule(Callable<V> callable, long delay, TimeUnit unit)
// 在指定的延迟后执行
ScheduledFuture<?> schedule(Runnable command, long delay, TimeUnit unit)
// 在指定的延迟后以固定速率执行(类似Timer.scheduleAtFixedRate())
ScheduledFuture<?> scheduleAtFixedRate(Runnable command, long initialDelay, long period, TimeUnit unit)
// 在指定的延迟后以固定间隔执行(类似Timer.schedule())

ScheduledFuture<?> scheduleWithFixedDelay(Runnable command, long initialDelay, long delay, TimeUnit unit)


比较:

·Timer对调度的支持是基于绝对时间的,因此任务对系统时间的改变是敏感的;而ScheduledThreadPoolExecutor支持相对时间。
·Timer使用单线程方式来执行所有的TimerTask,如果某个TimerTask很耗时则会影响到其他TimerTask的执行;而ScheduledThreadPoolExecutor则可以构造一个固定大小的线程池来执行任务。
·Timer不会捕获由TimerTask抛出的未检查异常,故当有异常抛出时,Timer会终止,导致未执行完的TimerTask不再执行,新的TimerTask也不能被调度;ScheduledThreadPoolExecutor对这个问题进行了妥善的处理,不会影响其他任务的执行。


结论:
Timer有这么多的缺点,如果是使用JDK1.5以上的话,应该没什么理由要使用Timer来进行调度把:)

==============================================================================

很显然,推荐使用的就是ScheduledThreadPoolExecutor ,但是我们知道ScheduledThreadPoolExecutor 不能支持绝对时间,比如,我希望每天凌晨00:05分执行一个Runnable线程,它就没有直接的接口,Timer有!

但是,我们可以去自己实现该接口,比如实时比对当前系统时间,在定时时间内完成!当然健壮性可能不好,建议参考Quartz的代码实现!

  • 上一篇文章:
  • 下一篇文章: 没有了
  • 赞助商链接
    推荐文章
  • 此栏目下没有推荐文章
  • {
    设为首页 | 加入收藏 | 友情链接 | 网站地图 | 联系站长 |