Timer和ScheduledThreadPoolExecutor的区别

Timer的主要方法有:ide

// 安排在指定的时间执行spa

void schedule(TimerTask task, Date time).net

// 安排在指定的时间开始以重复的延时执行线程

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

// 安排在指定的延迟后执行get

void schedule(TimerTask task, long delay)it

// 安排在指定的延迟后开始以重复的延时执行io

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

// 安排在指定的时间开始以重复的速率执行ast

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来进行调度把:)

 

 

本文转自:http://blog.csdn.net/masterseventeen/article/details/3443114

相关文章
相关标签/搜索