1. 程式人生 > >Java執行緒(六):Executor、ExecutorService

Java執行緒(六):Executor、ExecutorService

Executor

public interface Executor

  1. 執行已提交的 Runnable 任務的物件。
  2. 此介面提供一種將任務提交與每個任務將如何執行的機制(包括執行緒使用的細節、排程等)分離開來的方法。
  3. 記憶體一致性效果:執行緒中將 Runnable 物件提交到 Executor 之前的操作 happen-before 其執行開始(可能在另一個執行緒中)。

通俗地理解是執行緒的提交與如何執行分離,執行已提交的 Runnable 任務的物件即可對已提交的執行緒任務進行自定義操作。

public interface Executor {
    /**
     * 在未來某個時間執行給定的命令。該命令可能在新的執行緒、已入池的執行緒或者正呼叫的執行緒中執行,這由 Executor 實現決定。
     */
void execute(Runnable command); }

ExecutorService

public interface ExecutorService extends Executor

  1. 提供了管理終止的方法,以及可為跟蹤一個或多個非同步任務執行狀況而生成 Future 的方法。
  2. 可以關閉 ExecutorService,這將導致其拒絕新任務。
  3. 提供兩個方法來關閉 ExecutorService。shutdown() 方法在終止前允許執行以前提交的任務,而 shutdownNow() 方法阻止等待任務啟動並試圖停止當前正在執行的任務。
  4. 記憶體一致性效果:執行緒中向 ExecutorService 提交 Runnable 或 Callable 任務之前的操作 happen-before 由該任務所提取的所有操作,後者依次 happen-before 通過 Future.get() 獲取的結果。

方法摘要

void shutdown()

啟動一次順序關閉,執行以前提交的任務,但不接受新任務。如果已經關閉,則呼叫沒有其他作用。

List shutdownNow()

試圖停止所有正在執行的活動任務,暫停處理正在等待的任務,並返回等待執行的任務列表。
無法保證能夠停止正在處理的活動執行任務,但是會盡力嘗試。例如,通過 Thread.interrupt() 來取消典型的實現,所以任何任務無法響應中斷都可能永遠無法終止。

boolean isShutdown()

如果此執行程式已關閉,則返回 true。

boolean isTerminated()

如果關閉後所有任務都已完成,則返回 true。注意,除非首先呼叫 shutdown 或 shutdownNow,否則 isTerminated 永不為 true。

boolean awaitTermination(long timeout, TimeUnit unit) throws InterruptedException

請求關閉、發生超時或者當前執行緒中斷,無論哪一個首先發生之後,都將導致阻塞,直到所有任務完成執行。
一般shutdown之後,使用此方法保證所有以前提交的任務執行完成。

Future submit(Callable task)

提交一個返回值的任務用於執行,返回一個表示任務的未決結果的 Future。該 Future 的 get 方法在成功完成時將會返回該任務的結果。
如果想立即阻塞任務的等待,則可以使用 result = exec.submit(aCallable).get(); 形式的構造。

Future submit(Runnable task, T result)

提交一個 Runnable 任務用於執行,並返回一個表示該任務的 Future。該 Future 的 get 方法在成功完成時將會返回給定的結果result。

Future<?> submit(Runnable task)

提交一個 Runnable 任務用於執行,並返回一個表示該任務的 Future。該 Future 的 get 方法在 成功 完成時將會返回 null。
等價於 submit(task, null)。

List invokeAll(Collection<? extends Callable> tasks) throws InterruptedException

執行給定的任務,當所有任務完成時,返回保持任務狀態和結果的 Future 列表。返回列表的所有元素的 Future.isDone() 為 true。
支援限時等待。

T invokeAny(Collection<? extends Callable> tasks) throws InterruptedException, ExecutionException

執行給定的任務,如果某個任務已成功完成(也就是未丟擲異常),則返回其結果。一旦正常或異常返回後,則取消尚未完成的任務。如果此操作正在進行時修改了給定的 collection,則此方法的結果是不確定的。
支援限時等待。

總結:

  1. Executor 介面定義了 execute()方法用來接收一個Runnable介面的物件,而 ExecutorService 介面中的 submit()方法可以接受Runnable和Callable介面的物件。
  2. Executor 中的 execute() 方法不返回任何結果,而 ExecutorService 中的 submit()方法可以通過一個 Future 物件返回運算結果,invokeAll返回Futrue列表,invokeAny返回運算結果。
  3. ExecutorService可以關閉執行緒池shutDown,而Executor沒有。
  4. ExecutorService可以通過Future.cancel取消等待中的任務,而Executor沒有。

通俗地理解:ExecutorService是Executor的增強。在執行已提交的 Runnable 任務的物件基礎上,可對執行緒池關閉,或通過Future獲得運算結果或取消執行緒。