Java併發包:ScheduledExecutorService
文章譯自:http://tutorials.jenkov.com/java-util-concurrent/index.html
抽空翻譯了一下這個教程的文章,後面會陸續放出,如有不妥,請批評指正。
轉自請註明出處。
ScheduledExecutorService
java.util.concurrent.ScheduleExecutorService是一種安排任務執行的ExecutorService,任務可以延遲執行,或者在一個固定的時間間隔內重複執行。任務通過工作執行緒並且不能被正在處理任務的執行緒非同步執行,。
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);
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
首先建立一個帶有5個執行緒的SechuleExecutorService。然後將Callbale介面的匿名例項類被傳遞給schedule()方法。最後兩個引數指定了Callable將在5秒後執行。
ScheduledExecutorService的具體實現
ScheduledExecutorService是一個介面類,java.util.concurrent包中有以下關於此介面的實現類:
- ScheduledThreadPoolExecutor
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();
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
例子輸出結果:
Executed!
result = Called!
- 1
- 2
- schedule (Runnable task, long delay, TimeUnit timeunit)
這個方法類似於用Callable作為引數的版本(上面的方法),ScheduledFuture.get()方法在任務執行完畢時返回null。
- scheduleAtFixedRate (Runnable, long initialDelay, long period,
TimeUnit timeunit)
這個方法可以週期性的執行任務。任務在initialDelay時間後第一次執行,然後每次週期迴圈執行。
如果執行的任務丟擲了異常,任務不會再執行了,如果沒有丟擲異常,任務將繼續執行直到 ScheduledExecutorService 關閉。
如果任務執行時間超過了任務之間間隔的時間,下個任務將會在當前任務完成後再執行。執行任務的執行緒每次不會超過一個。
- scheduleWithFixedDelay (Runnable, long initialDelay, long period,
TimeUnit timeunit)
這個方法與scheduleAtFixedRate()方法類似,只是對period理解是不同的。
scheduleAtFixedRate()方法的period指的是上一個任務開始執行到下一個任務開始執行的時間間隔。
然而,這個方法的period指的是上一個任務執行完到下一個任務開始執行之間的時間間隔。
ScheduledExecutorService Shutdown
就像ExecutorService,ScheduleExecutorService在使用完之後需要關閉一樣。如果不這樣做,jvm將會一直在執行。儘管所有其他的執行緒都被關閉了。
關閉 ScheduleExecutorService使用shutdown()和shutdownNow()方法,這個兩個方法繼承自ExecutorService介面。 檢視ExecutorService Shutdown部分了解更多。