Java定时任务Timer、TimerTask与ScheduledThreadPoolExecutor详解
2014-01-19 21:41
281 查看
定时任务就是在指定时间执行程序,或周期性执行计划任务。Java中实现定时任务的方法有很多,本文从从JDK自带的一些方法来实现定时任务的需求。
一、Timer和TimerTask
Timer和TimerTask可以作为线程实现的第三种方式(前两种详见《Java多线程基础》),JDK1.5之后定时任务推荐使用ScheduledThreadPoolExecutor。
1、快速入门
Timer运行在后台,可以执行任务一次,或定期执行任务。TimerTask类继承了Runnable接口,因此具备多线程的能力。一个Timer可以调度任意多个TimerTask,所有任务都存储在一个队列中顺序执行,如果需要多个TimerTask并发执行,则需要创建两个多个Timer。
一个简单使用Timer的例子如下:
View Code
2、调度方法
1) schedule(Callable callable, long delay, TimeUnit unit); 延迟delay时间后开始执行callable
2) scheduleAtFixedRate(Runnable command, long initialDelay, long period, TimeUnit unit); 延迟initialDelay时间后开始执行command,并且按照period时间周期性重复调用,当任务执行时间大于间隔时间时,之后的任务都会延迟,此时与Timer中的schedule方法类似
3) scheduleWithFixedDelay(Runnable command, long initialDelay, long delay, TimeUnit unit); 延迟initialDelay时间后开始执行command,并且按照period时间周期性重复调用,这里的间隔时间delay是等上一个任务完全执行完毕才开始计算,与Timer中scheduleAtFixedRate情况不同。
图2 ScheduledThreadPoolExecutor.scheduleWithFixedDelay与Timer.scheduleAtFixedRate任务执行区别
3、与Timer相比,优点有:
1) ScheduledThreadPoolExecutor线程会捕获任务重的异常,即使多个计划任务中存在某几个计划任务为捕获异常的情况,也不会影响ScheduledThreadPoolExecutor总线程的工作,不会影响其他计划任务的继续执行。
2) ScheduledThreadPoolExecutor是基于相对时间的,对系统时间的改变不敏感,但是如果执行某一绝对时间(如2014/02/14 17:13:06)执行任务,可能不好执行,此时可使用Timer。
3) ScheduledThreadPoolExecutor是线程池,如任务数过多或某些任务执行时间较长,可自动分配更多的线程来执行计划任务。
总之,JDK1.5之后,计划任务建议使用ScheduledThreadPoolExecutor。
一、Timer和TimerTask
Timer和TimerTask可以作为线程实现的第三种方式(前两种详见《Java多线程基础》),JDK1.5之后定时任务推荐使用ScheduledThreadPoolExecutor。
1、快速入门
Timer运行在后台,可以执行任务一次,或定期执行任务。TimerTask类继承了Runnable接口,因此具备多线程的能力。一个Timer可以调度任意多个TimerTask,所有任务都存储在一个队列中顺序执行,如果需要多个TimerTask并发执行,则需要创建两个多个Timer。
一个简单使用Timer的例子如下:
private final static ScheduledThreadPoolExecutor schedual = new ScheduledThreadPoolExecutor(1, new ThreadFactory() { private AtomicInteger atoInteger = new AtomicInteger(0); public Thread newThread(Runnable r) { Thread t = new Thread(r); t.setName("xxx-Thread "+ atoInteger.getAndIncrement()); return t; } });
View Code
2、调度方法
1) schedule(Callable callable, long delay, TimeUnit unit); 延迟delay时间后开始执行callable
2) scheduleAtFixedRate(Runnable command, long initialDelay, long period, TimeUnit unit); 延迟initialDelay时间后开始执行command,并且按照period时间周期性重复调用,当任务执行时间大于间隔时间时,之后的任务都会延迟,此时与Timer中的schedule方法类似
3) scheduleWithFixedDelay(Runnable command, long initialDelay, long delay, TimeUnit unit); 延迟initialDelay时间后开始执行command,并且按照period时间周期性重复调用,这里的间隔时间delay是等上一个任务完全执行完毕才开始计算,与Timer中scheduleAtFixedRate情况不同。
图2 ScheduledThreadPoolExecutor.scheduleWithFixedDelay与Timer.scheduleAtFixedRate任务执行区别
3、与Timer相比,优点有:
1) ScheduledThreadPoolExecutor线程会捕获任务重的异常,即使多个计划任务中存在某几个计划任务为捕获异常的情况,也不会影响ScheduledThreadPoolExecutor总线程的工作,不会影响其他计划任务的继续执行。
2) ScheduledThreadPoolExecutor是基于相对时间的,对系统时间的改变不敏感,但是如果执行某一绝对时间(如2014/02/14 17:13:06)执行任务,可能不好执行,此时可使用Timer。
3) ScheduledThreadPoolExecutor是线程池,如任务数过多或某些任务执行时间较长,可自动分配更多的线程来执行计划任务。
总之,JDK1.5之后,计划任务建议使用ScheduledThreadPoolExecutor。
相关文章推荐
- 定时任务 java.util.Timer和TimerTask
- 定时任务:Java中Timer和TimerTask的使用
- 定时任务:Java中Timer和TimerTask的使用
- 【整理】定时任务:Java中Timer和TimerTask的使用
- 定时任务:Java中Timer和TimerTask的使用
- java定时任务--Timer、TimerTask
- 定时任务:Java中Timer和TimerTask的使用
- java Timer ,TimerTask执行定时任务
- 定时任务:Java中Timer和TimerTask的使用
- 定时任务:Java中Timer和TimerTask的使用
- 定时任务:Java中Timer和TimerTask的使用
- 定时任务:Java中Timer和TimerTask的使用
- 定时任务:Java中Timer和TimerTask的使用
- 定时任务:Java中Timer和TimerTask的使用
- java定时任务学习:Timer和TimerTask
- 定时任务:Java中Timer和TimerTask的使用
- 定时任务:Java中Timer和TimerTask的使用
- 定时任务:Java中Timer和TimerTask的使用
- 定时任务:Java中Timer和TimerTask的使用
- 定时任务:Java中Timer和TimerTask的使用