1. 程式人生 > >Java併發包:ScheduledExecutorService

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部分了解更多。