idea提示使用ScheduledExecutorService代替Timer吧
Timer不支持并发。
Timer不支持多线程。全部挂在Timer下的任务都是单线程的,任务仅仅能串行运行。假设当中一个任务运行时间过长。会影响到其它任务的运行,然后就可能会有各种接踵而来的问题。如果重开一个Timer?难道要为全部的耗时的Task都单开一个Timer。显然是不太可能。这样就太乱了。
Timer的线程不捕获异常。TimerTask假设抛出异常,那么Timer唯一的进程就会挂掉,这样挂在Timer下的全部任务都会无法继续运行
为了弥补Timer的缺陷,jdk1.5中引入了并发包。这里面提供的ScheduledExecutorService。详细实现类是:ScheduledThreadPoolExecutor。ScheduledThreadPoolExecutor支持多线程。同一时候在线程中对异常进行了捕获。所以是Timer的完美替换者。
多线程并行处理定时任务时,Timer运行多个TimeTask时,只要其中之一没有捕获抛出的异常,其它任务便会自动终止运行,使用ScheduledExecutorService则没有这个问题。
将timer替换为ScheduledExecutorService
executorService = new ScheduledThreadPoolExecutor(1,new BasicThreadFactory.Builder().namingPattern("cache-schedule-pool-%d").daemon(true).build());
executorService.scheduleAtFixedRate(new CacheExpiryCleaner(),0, PERIOD,TimeUnit.MILLISECONDS);
线程结束时销毁
/**
* 销毁
*/
@PreDestroy
public void preDestroy() {
try {
executorService.shutdown();
} catch (IOException e) {
log.error("close leveldb error ", e);
}
}