使用ScheduledExecutorService替代timer

Timer不支持并发。

Timer不支持多线程。全部挂在Timer下的任务都是单线程的,任务仅仅能串行运行。假设当中一个任务运行时间过长。会影响到其它任务的运行,然后就可能会有各种接踵而来的问题。如果重开一个Timer?难道要为全部的耗时的Task都单开一个Timer。显然是不太可能。这样就太乱了。
Timer的线程不捕获异常。TimerTask假设抛出异常,那么Timer唯一的进程就会挂掉,这样挂在Timer下的全部任务都会无法继续运行

为了弥补Timer的缺陷,jdk1.5中引入了并发包。这里面提供的ScheduledExecutorService。详细实现类是:ScheduledThreadPoolExecutor。ScheduledThreadPoolExecutor支持多线程。同一时候在线程中对异常进行了捕获。所以是Timer的完美替换者。

摘自
原文链接:https://blog.csdn.net/fly910905/article/details/81542655

------------------------------------------------------------------------------------------------

这种情况,我们只需要按照阿里规约里面给的建议。

多线程并行处理定时任务时,Timer运行多个TimeTask时,只要其中之一没有捕获抛出的异常,其它任务便会自动终止运行,使用ScheduledExecutorService则没有这个问题。 
            

    //org.apache.commons.lang3.concurrent.BasicThreadFactory
    ScheduledExecutorService executorService = new ScheduledThreadPoolExecutor(1,
        new BasicThreadFactory.Builder().namingPattern("example-schedule-pool-%d").daemon(true).build());
    executorService.scheduleAtFixedRate(new Runnable() {
        @Override
        public void run() {
            //do something
        }
    },initialDelay,period, TimeUnit.HOURS);


     去替换timer。

//用Executor代替new timer 
 /**
     *    1是核心线程数量,后面参数是一个线程工厂,采用了建造者模式创建
      *    可以通过线程工厂给每个创建出来的线程设置符合业务的名字。
     */
    ScheduledExecutorService executorService = new ScheduledThreadPoolExecutor(1,
            new BasicThreadFactory.Builder().namingPattern("example-schedule-pool-%d").daemon(true).build());
  
      //用scheduleAtFixedRate代替schedule
            long initialDelay=500;
            long period=2500;
            executorService.scheduleAtFixedRate(this.timer,initialDelay,period, TimeUnit.MILLISECONDS);
//            this.time.schedule(this.timer, 500, 2500);
发布了39 篇原创文章 · 获赞 2 · 访问量 5015

猜你喜欢

转载自blog.csdn.net/u013636987/article/details/102671841
今日推荐