定時器(三)Timer的替代ScheduledExecutorService
阿新 • • 發佈:2018-12-27
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是如果該任務已經開始,則會等該次任務結束後取消下次定時任務的執行;