为什么用ScheduledExecutorService替代Timer

1,019 阅读1分钟

###0.序言 使用阿里巴巴的代码规范插件,如果用了Timer 总会遇到一个:

image.png
插件给出的解释是:
image.png

简单查了下之后,发现使用 ScheduledThreadPoolExecutor 替代 Timer 有如下好处

1.Timer执行所有定时任务时候只会创建一个线程,比如某个任务10s执行一遍,而另外一个每40s执行一遍,那么在40s的执行结束后,你可能会丢失这4次10s的任务,或者是快速连续的调用四次10s(取决于它是基于固定速率调度还是固定延时的调度)
2. 如果TimerTask抛出一个未检查的异常,如果没捕获就会整个Timer都被取消,已经调度但是没执行的也不会执行,新的也不会被调度,这个被称为线程泄露
3. Timer执行周期任务基于绝对时间,ScheduledThreadPoolExecutor基于相对时间,所以前者会受到系统时间的影响,而后者不会