Timer和ScheduledThreadPoolExecutor的区别
两者都可以完成任务的定时执行,但是,阿里巴巴推荐使用定时线程池ScheduledThreadPoolExecutor,为什么呢?
先看一段代码
Timer timer = new Timer();
timer.scheduleAtFixedRate(new TimerTask() {
@Override
public void run() {
System.out.println("Timer类实现延时执行任务");
}
},100,1000);
因为Timer是单线程,他依赖内部的一个线程属性TimerThread
private final TimerThread thread = new TimerThread(queue);
而TimerThread继承了Thread类,也就是说Timer是一个单线程的!
class TimerThread extends Thread{ }
测试代码:
public static void main(String[] args) {
Timer timer = new Timer();
timer.scheduleAtFixedRate(new TimerTask() {
@Override
public void run() {
System.out.println("Timer类实现延时执行任务一");
throw new RuntimeException();
}
},100,1000);
try {
Thread.sleep(1000);
}catch (InterruptedException e){
e.printStackTrace();
}
timer.scheduleAtFixedRate(new TimerTask() {
@Override
public void run() {
System.out.println("Timer类实现延时执行任务二");
throw new RuntimeException();
}
},100,1000);
}
测试结果
第二个任务也会抛异常,因为Timer已经抛异常被取消了
结论:如果Timer中的任务有异常,那么Timer中剩下的所有任务都会抛异常,而定时线程池中一个任务出现异常,其他任务照常执行,这就是Timer和ScheduledThreadPoolExecutor的区别。