定时器(三)Timer的替代ScheduledExecutorService

ScheduledExecutorService其实是一个线程池,用来定时多线程会互不影响,
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        ScheduledExecutorService mScheduledExecutorService = new ScheduledThreadPoolExecutor(3);
        ScheduledFuture<?> future = mScheduledExecutorService.scheduleAtFixedRate(new TimerTask() {
            @Override
            public void run() {
                System.out.println("schedule--A:" + sdf.format(new Date()));
            }
        }, 0,5,TimeUnit.SECONDS);

        ScheduledFuture<?> future1 = mScheduledExecutorService.scheduleAtFixedRate(new TimerTask() {
            @Override
            public void run() {
                System.out.println("schedule--10 * 1000--B");
                System.out.println(sdf.format(new Date()) + " B: sleep");
                try {
                    Thread.sleep(20*1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }, 10,5,TimeUnit.SECONDS);
        ScheduledFuture<?> future2 = mScheduledExecutorService.scheduleAtFixedRate(new TimerTask() {
            @Override
            public void run() {
                System.out.println(sdf.format(new Date()) + " C: throw Exception");
                try {
                    Thread.sleep(3000);
//                    System.out.println(sdf.format(new Date()) + "unCancel");
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                throw new RuntimeException("test");
            }
        }, 30,5,TimeUnit.SECONDS);

日志如下:

schedule--A:2018-12-27 13:50:48
schedule--A:2018-12-27 13:50:53
schedule--A:2018-12-27 13:50:58
schedule--10 * 1000--B
2018-12-27 13:50:58 B: sleep
schedule--A:2018-12-27 13:51:03
schedule--A:2018-12-27 13:51:08
schedule--A:2018-12-27 13:51:13
schedule--A:2018-12-27 13:51:18
2018-12-27 13:51:18 C: throw Exception
schedule--10 * 1000--B
2018-12-27 13:51:18 B: sleep
schedule--A:2018-12-27 13:51:23
schedule--A:2018-12-27 13:51:28
schedule--A:2018-12-27 13:51:33
schedule--A:2018-12-27 13:51:38
schedule--10 * 1000--B
2018-12-27 13:51:38 B: sleep
schedule--A:2018-12-27 13:51:43
schedule--A:2018-12-27 13:51:48

可以看到C抛出异常后,A跟B都在执行各自的任务,并且A跟B执行的各自任务是相互独立;

☆☆☆☆☆接下来看怎么取消任务的执行了?

在执行定时任务会有一个对象返回ScheduledFuture<?> future2 = mScheduledExecutorService.scheduleAtFixedRate

该对象有一个方法可以取消任务执行future1.cancel(true);参数传true是说明如果该任务已经开始了,立即中断该任务,传false是如果该任务已经开始,则会等该次任务结束后取消下次定时任务的执行;

猜你喜欢

转载自blog.csdn.net/hujiaxi222/article/details/85278510
今日推荐