Timer类负责管理延时任务以及周期任务,然而它存在一些缺陷,生产环境中应该考虑使用ScheduledThreadPoolExecutor来替代它。
缺陷一
TImer在执行所有定时任务时只会创建一个线程。如果某个任务的执行时间过长,那么将破坏其他TimerTask的定时精确性。例如:某个周期TimerTask需要每10ms执行一次,而另一个TimerTask需要执行40ms,那么这个周期任务或者在40ms执行完成后快速连续的调用4次,或者彻底丢弃这4次调用(取决于它是基于固定速率调用还是固定延时调用)
缺陷二
如果TimerTask抛出一个未检查的异常,将导致其终止定时线程,这种情况下Timer不会恢复线程的执行,而是将整个Timer都取消了,未执行的Timer不会被执行,新的任务也不会再执行