总的来说,优先级:Quartz > ScheduledThreadPoolExecutor > Timer
方式 |
调度方式 |
线程方式 |
异常处理 |
Timer(不建议使用) | 基于绝对时间,因此任务对系统时间的改变是敏感的 | 用单线程方式来执行所有的TimerTask,如果某个TimerTask很耗时则会影响到其他TimerTask的执行 | 不会捕获由TimerTask抛出的未检查异常,故当有异常抛出时,Timer会终止,导致未执行完的TimerTask不再执行 |
ScheduledThreadPoolExecutor | 基于相对时间。这这同时也意味着,没法实现“请在每天00:05帮我执行myTask”这样的需求。 | 构造一个固定大小的线程池来执行任务 | 进行了妥善的处理,不会影响其他任务的执行 |
Quartz | 作业+触发器。作业 是能够调度的可执行任务,触发器 提供了对作业的调度。可以处理绝对时间&相对时间。 | 可以指定线程池大小。 | 进行了妥善的处理,不会影响其他任务的执行 |
1. Timer
Timer timer = new Timer();
timer.schedule(new TimerTask() {
private int i=0;
@Override
public void run() {
System.out.println("Round " + i++);
}
}, 0, 5000);//5s
2. ScheduleAtFixedRate()
ScheduledThreadPoolExecutor pool = new ScheduledThreadPoolExecutor(5);
pool.scheduleAtFixedRate(new Runnable() {
private int i=0;
@Override
public void run() {
System.out.println("Round " + i++);
}
}, 0, 5, TimeUnit.SECONDS);
3. Quartz
看课堂二:http://www.cnblogs.com/alipayhutu/archive/2012/06/05/2536617.html
http://www.ibm.com/developerworks/cn/java/j-quartz/
http://www.opensymphony.com/quartz/
http://blog.csdn.net/szwangdf/article/details/6158646
http://blog.csdn.net/masterseventeen/article/details/3443114