定时器(三)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是如果该任务已经开始,则会等该次任务结束后取消下次定时任务的执行;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值