JAVA.util.concurrent.ScheduledExecutorService是一個可以安排任務延遲執行的 ExecutorService , 或者以固定的時間間隔重復執行。任務通過一個工作線程異步執行,而不是提交任務到ScheduledExecutorService的線程。
ScheduledExecutorService例子
下面是ScheduledExecutorService例子:
ScheduledExecutorService scheduledExecutorService =
Executors.newScheduledThreadPool(5);
ScheduledFuture scheduledFuture =
scheduledExecutorService.schedule(new Callable() {
public Object call() throws Exception {
System.out.println("Executed!");
return "Called!";
}
},
5,
TimeUnit.SECONDS);
首先,創建一個容納5個線程的.然后,創建了Callable 接口的一個匿名類作為參數提交到Callable。
ScheduledExecutorService實現
既然ScheduledExecutorService是個接口, ava.util.concurrent包中的ScheduledExecutorService 的類實現了該接口:
- ScheduledThreadPoolExecutor
創建ScheduledExecutorService
創建 ScheduledExecutorService 取決于你用哪種實現,當然也可以Executors 的工廠方法創建ScheduledExecutorService 實例,下面是代碼:
ScheduledExecutorService scheduledExecutorService =
Executors.newScheduledThreadPool(5);
ScheduledExecutorService用法
一旦創建了 ScheduledExecutorService,可以用下面方法 :
- schedule (Callable task, long delay, TimeUnit timeunit)
- schedule (Runnable task, long delay, TimeUnit timeunit)
- scheduleAtFixedRate (Runnable, long initialDelay, long period, TimeUnit timeunit)
- scheduleWithFixedDelay (Runnable, long initialDelay, long period, TimeUnit timeunit)
下面一一講解這些方法:
schedule (Callable task, long delay, TimeUnit timeunit)
這個方法安排給定得 Callable 延遲執行,這方法返回ScheduledFuture ,可以用于在任務未執行前取消任務或者當執行完了獲取返回結果,下面是代碼:
ScheduledExecutorService scheduledExecutorService =
Executors.newScheduledThreadPool(5);
ScheduledFuture scheduledFuture =
scheduledExecutorService.schedule(new Callable() {
public Object call() throws Exception {
System.out.println("Executed!");
return "Called!";
}
},
5,
TimeUnit.SECONDS);
System.out.println("result = " + scheduledFuture.get());
scheduledExecutorService.shutdown();
輸出結果:
Executed!
result = Called!
schedule (Runnable task, long delay, TimeUnit timeunit)
這個方法類似于上面得方法,但是沒有返回結果,所以任務完成 ScheduledFuture.get()將返回null。
scheduleAtFixedRate (Runnable, long initialDelay, long period, TimeUnit timeunit)
這個方法安排任務間隔執行,任務首次在initialDelay以后執行,然后每次間隔initialDelay執行。如果任何一次拋異常,那么任務不再執行,如果沒有異常,任務一直執行直到ScheduledExecutorService 關閉,如果當前線程執行時間很長,那么下一個任務要等到這個任務執行完成,在同一時間只執行一個任務。
scheduleWithFixedDelay (Runnable, long initialDelay, long period, TimeUnit timeunit)
這個方法和 scheduleAtFixedRate()非常相似,只是時間段有不同的解釋。
在scheduleAtFixedRate()方法中,周期被解釋為從上一次執行開始到下一次執行開始之間的延遲。
然而,在這種方法中,周期被解釋為上一次執行結束到下一次執行開始之間的延遲。因此,延遲是在完成執行之間,而不是在執行開始之間。
ScheduledExecutorService Shutdown
和 ExecutorService一樣, 當任務執行完畢 ScheduledExecutorService需要關閉,如果不關閉,一直在JVM中運行,盡管其他線程已經關閉。
關閉ScheduledExecutorService用shutdown() 或者 shutdownNow() 方法,這兩個方法是從ExecutorService接口繼承得, 可以查看前面文章 ExecutorService 中得Shutdown 。
參考:https://blog.csdn.net/cgsyck/article/details/107692471
http://tutorials.jenkov.com/java-util-concurrent/scheduledexecutorservice.html
https://blog.csdn.net/cgsyck/article/details/107769550