scheduleAtFixedRate
每間隔一段時間執行,分為兩種情況:
-
當前任務執行時間小於間隔時間,每次到點即執行;
/** * 任務執行時間(8s)小於間隔時間(10s) */ public class ScheduleTest { static ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1); public static void main(String[] args) { scheduler.scheduleAtFixedRate(new Runnable() { @Override public void run() { System.out.println("Start: scheduleAtFixedRate: " + new Date()); try { Thread.sleep(8000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("End : scheduleAtFixedRate: " + new Date()); } }, 0, 10 , SECONDS); } } output: Start: scheduleAtFixedRate: Sun Apr 28 14:36:00 CST 2019 End : scheduleAtFixedRate: Sun Apr 28 14:36:08 CST 2019 Start: scheduleAtFixedRate: Sun Apr 28 14:36:10 CST 2019 End : scheduleAtFixedRate: Sun Apr 28 14:36:18 CST 2019 Start: scheduleAtFixedRate: Sun Apr 28 14:36:20 CST 2019 End : scheduleAtFixedRate: Sun Apr 28 14:36:28 CST 2019 Start: scheduleAtFixedRate: Sun Apr 28 14:36:30 CST 2019 End : scheduleAtFixedRate: Sun Apr 28 14:36:38 CST 2019 ... 程序啟動時間是14:36:00,以后每間隔10s執行一次(即14:36:10、14:36:20、14:36:30等)。
-
當前任務執行時間大於等於間隔時間,任務執行后立即執行下一次任務。相當於連續執行了。
/** * 任務執行時間(12s)大於間隔時間(10s) */ public class ScheduleTest { static ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1); public static void main(String[] args) { scheduler.scheduleAtFixedRate(new Runnable() { @Override public void run() { System.out.println("Start: scheduleAtFixedRate: " + new Date()); try { Thread.sleep(12000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("End : scheduleAtFixedRate: " + new Date()); } }, 0, 10 , SECONDS); } } output: Start: scheduleAtFixedRate: Sun Apr 28 14:30:13 CST 2019 End : scheduleAtFixedRate: Sun Apr 28 14:30:25 CST 2019 Start: scheduleAtFixedRate: Sun Apr 28 14:30:25 CST 2019 End : scheduleAtFixedRate: Sun Apr 28 14:30:37 CST 2019 Start: scheduleAtFixedRate: Sun Apr 28 14:30:37 CST 2019 End : scheduleAtFixedRate: Sun Apr 28 14:30:49 CST 2019 Start: scheduleAtFixedRate: Sun Apr 28 14:30:49 CST 2019 End : scheduleAtFixedRate: Sun Apr 28 14:31:01 CST 2019 程序啟動時間是14:30:13,按理說應該每間隔10s執行一次(即14:30:23、14:30:33等),但由於任務執行時間長於10s,下一次的任務要開始的時候發現上次的任務還沒有完成,因此阻塞等待,一旦發現上次的任務完成,就馬上啟動。表現出來就是任務延時啟動,最終的效果就是連續執行。
scheduleWithFixedDelay
每當上次任務執行完畢后,間隔一段時間執行。不管當前任務執行時間大於、等於還是小於間隔時間,執行效果都是一樣的。
/**
* 任務執行時間(8s)小於間隔時間(10s)
*/
public class ScheduleTest {
static ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);
public static void main(String[] args) {
scheduler.scheduleWithFixedDelay(new Runnable() {
@Override
public void run() {
System.out.println("Start: scheduleWithFixedDelay: " + new Date());
try {
Thread.sleep(12000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("End : scheduleWithFixedDelay: " + new Date());
}
}, 0, 10 , SECONDS);
}
}
output:
Start: scheduleWithFixedDelay: Sun Apr 28 14:27:59 CST 2019
End : scheduleWithFixedDelay: Sun Apr 28 14:28:07 CST 2019
Start: scheduleWithFixedDelay: Sun Apr 28 14:28:17 CST 2019
End : scheduleWithFixedDelay: Sun Apr 28 14:28:25 CST 2019
Start: scheduleWithFixedDelay: Sun Apr 28 14:28:35 CST 2019
End : scheduleWithFixedDelay: Sun Apr 28 14:28:43 CST 2019
Start: scheduleWithFixedDelay: Sun Apr 28 14:28:53 CST 2019
End : scheduleWithFixedDelay: Sun Apr 28 14:29:01 CST 2019
...
可以看出每個End后,等待了10秒,才啟動下一次Start。
/**
* 任務執行時間(12s)大於間隔時間(10s)
*/
public class ScheduleTest {
static ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);
public static void main(String[] args) {
scheduler.scheduleWithFixedDelay(new Runnable() {
@Override
public void run() {
System.out.println("Start: scheduleWithFixedDelay: " + new Date());
try {
Thread.sleep(12000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("End : scheduleWithFixedDelay: " + new Date());
}
}, 0, 10 , SECONDS);
}
}
output:
Start: scheduleWithFixedDelay: Sun Apr 28 14:26:29 CST 2019
End : scheduleWithFixedDelay: Sun Apr 28 14:26:41 CST 2019
Start: scheduleWithFixedDelay: Sun Apr 28 14:26:51 CST 2019
End : scheduleWithFixedDelay: Sun Apr 28 14:27:03 CST 2019
Start: scheduleWithFixedDelay: Sun Apr 28 14:27:13 CST 2019
End : scheduleWithFixedDelay: Sun Apr 28 14:27:25 CST 2019
Start: scheduleWithFixedDelay: Sun Apr 28 14:27:35 CST 2019
End : scheduleWithFixedDelay: Sun Apr 28 14:27:47 CST 2019
...
可以看出每個End后,等待了10秒,才啟動下一次Start。
參考
scheduleAtFixedRate vs scheduleWithFixedDelay