總結:java
scheduleAtFixedRate ,是以上一個任務開始的時間計時,period時間過去後,檢測上一個任務是否執行完畢,若是上一個任務執行完畢,則當前任務當即執行,若是上一個任務沒有執行完畢,則須要等上一個任務執行完畢後當即執行。ide
scheduleWithFixedDelay,是以上一個任務結束時開始計時,period時間過去後,當即執行。spa
重點:code
兩個方法以不一樣的時間點做爲參考。blog
例子:it
package com.yuankai.t1.thread; import java.util.concurrent.Executors; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.TimeUnit; public class ScheduleExecutorServiceTest { public static void main(String[] args) { ScheduleExecutorServiceTest test = new ScheduleExecutorServiceTest(); test.testWithFixedDelay(); } private ScheduledExecutorService executor; public ScheduleExecutorServiceTest() { executor = Executors.newScheduledThreadPool(4); } public void testAtFixedRate() { executor.scheduleAtFixedRate(new Runnable() { public void run() { System.out.println("===="); try { Thread.sleep(10000); System.out.println("執行完畢"); } catch (InterruptedException e) { e.printStackTrace(); } } }, 1000, 3000, TimeUnit.MILLISECONDS); } public void testWithFixedDelay() { executor.scheduleWithFixedDelay(new Runnable() { public void run() { System.out.println("===="); try { int i = 1 / 0; } catch (Exception e) { e.printStackTrace(); } /* try { Thread.sleep(10000); System.out.println("執行完畢"); } catch (InterruptedException e) { e.printStackTrace(); } */ } }, 1000, 3000, TimeUnit.MILLISECONDS); } }
注意:io
經過ScheduledExecutorService執行的週期任務,若是任務執行過程當中拋出了異常,那麼過ScheduledExecutorService就會中止執行任務,且也不會再週期地執行該任務了。因此你若是想保住任務都一直被週期執行,那麼catch一切可能的異常。event