1. 程式人生 > >定時器(三)Timer的替代ScheduledExecutorService

定時器(三)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是如果該任務已經開始,則會等該次任務結束後取消下次定時任務的執行;