idea提示使用ScheduledExecutorService代替Timer吧

idea提示使用ScheduledExecutorService代替Timer吧

使用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);
    }
}

详情可以查看线程相关帖子

评论

企鹅群:39438021

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×