您的位置:首页 > 编程语言 > Java开发

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的例子如下:

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。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: