java中ExecutorService接口

一、聲明

public interface ExecutorService extends Executor     位於java.util.concurrent包下

所有超級接口:Executor

所有已知子接口:ScheduledExecutorService

所有已知實現類:AbstractExecutorService, ScheduledThreadPoolExecutor, ThreadPoolExecutor

二、概述

Executor 提供了管理終止的方法,以及可爲跟蹤一個或多個異步任務執行狀況而生成 Future 的方法。

可以關閉 ExecutorService,這將導致其拒絕新任務。提供兩個方法來關閉 ExecutorServiceshutdown()方法在終止前允許執行以前提交的任務,而shutdownNow() 方法阻止等待任務啓動並試圖停止當前正在執行的任務。在終止時,執行程序沒有任務在執行,也沒有任務在等待執行,並且無法提交新任務。應該關閉未使用的ExecutorService 以允許回收其資源。

通過創建並返回一個可用於取消執行和/或等待完成的 Future,方法 submit 擴展了基本方法Executor.execute(java.lang.Runnable)。方法 invokeAny 和 invokeAll 是批量執行的最常用形式,它們執行任務 collection,然後等待至少一個,或全部任務完成(可使用ExecutorCompletionService 類來編寫這些方法的自定義變體)。

Executors 類提供了用於此包中所提供的執行程序服務的工廠方法。

下面給出了一個網絡服務的簡單結構,這裏線程池中的線程作爲傳入的請求。它使用了預先配置的Executors.newFixedThreadPool(int) 工廠方法:

[java] view plaincopy在CODE上查看代碼片派生到我的代碼片
  1. class NetworkService implements Runnable {  
  2.    private final ServerSocket serverSocket;  
  3.    private final ExecutorService pool;  
  4.   
  5.    public NetworkService(int port, int poolSize)  
  6.        throws IOException {  
  7.      serverSocket = new ServerSocket(port);  
  8.      pool = Executors.newFixedThreadPool(poolSize);  
  9.    }  
  10.   
  11.    public void run() { // run the service  
  12.      try {  
  13.        for (;;) {  
  14.          pool.execute(new Handler(serverSocket.accept()));  
  15.        }  
  16.      } catch (IOException ex) {  
  17.        pool.shutdown();  
  18.      }  
  19.    }  
  20.  }  
  21.   
  22.  class Handler implements Runnable {  
  23.    private final Socket socket;  
  24.    Handler(Socket socket) { this.socket = socket; }  
  25.    public void run() {  
  26.      // read and service request on socket  
  27.    }  
  28. }  

下列方法分兩個階段關閉 ExecutorService。第一階段調用 shutdown 拒絕傳入任務,然後調用shutdownNow(如有必要)取消所有遺留的任務:

[java] view plaincopy在CODE上查看代碼片派生到我的代碼片
  1. void shutdownAndAwaitTermination(ExecutorService pool) {  
  2.    pool.shutdown(); // Disable new tasks from being submitted  
  3.    try {  
  4.      // Wait a while for existing tasks to terminate  
  5.      if (!pool.awaitTermination(60, TimeUnit.SECONDS)) {  
  6.        pool.shutdownNow(); // Cancel currently executing tasks  
  7.        // Wait a while for tasks to respond to being cancelled  
  8.        if (!pool.awaitTermination(60, TimeUnit.SECONDS))  
  9.            System.err.println("Pool did not terminate");  
  10.      }  
  11.    } catch (InterruptedException ie) {  
  12.      // (Re-)Cancel if current thread also interrupted  
  13.      pool.shutdownNow();  
  14.      // Preserve interrupt status  
  15.      Thread.currentThread().interrupt();  
  16.    }  
  17.  }  

內存一致性效果:線程中向 ExecutorService 提交 Runnable 或 Callable 任務之前的操作happen-before 由該任務所提取的所有操作,後者依次 happen-before 通過 Future.get() 獲取的結果。

從以下版本開始:1.5

三、方法詳細

1、void shutdown()

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

拋出: SecurityException - 如果安全管理器存在並且關閉,此 ExecutorService 可能操作某些不允許調用者修改的線程(因爲它沒有保持RuntimePermission("modifyThread")),或者安全管理器的 checkAccess方法拒絕訪問。

 

2、List<Runnable> shutdownNow()  試圖停止所有正在執行的活動任務,暫停處理正在等待的任務,並返回等待執行的任務列表。

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

返回: 從未開始執行的任務的列表

拋出: SecurityException - 如果安全管理器存在並且關閉,此 ExecutorService 可能操作某些不允許調用者修改的線程(因爲它沒有保持RuntimePermission("modifyThread")),或者安全管理器的 checkAccess方法拒絕訪問。

 

3、boolean isShutdown()    如果此執行程序已關閉,則返回 true

 

4、boolean isTerminated()  如果關閉後所有任務都已完成,則返回 true。注意,除非首先調用shutdown 或shutdownNow,否則 isTerminated 永不爲 true

 

5、boolean awaitTermination(long timeout, TimeUnit unit) throws InterruptedException

請求關閉、發生超時或者當前線程中斷,無論哪一個首先發生之後,都將導致阻塞,直到所有任務完成執行。

參數:timeout - 最長等待時間

unit - timeout 參數的時間單位

返回:如果此執行程序終止,則返回 true;如果終止前超時期滿,則返回 false

拋出:InterruptedException - 如果等待時發生中斷

 

6、<T> Future<T> submit(Callable<T> task) 

提交一個返回值的任務用於執行,返回一個表示任務的未決結果的 Future。該 Future 的 get 方法在成功完成時將會返回該任務的結果。

如果想立即阻塞任務的等待,則可以使用 result = exec.submit(aCallable).get(); 形式的構造。

注:Executors 類包括了一組方法,可以轉換某些其他常見的類似於閉包的對象,例如,將PrivilegedAction 轉換爲Callable 形式,這樣就可以提交它們了。

參數: task - 要提交的任務

返回: 表示任務等待完成的 Future

拋出: RejectedExecutionException - 如果任務無法安排執行

NullPointerException - 如果該任務爲 null

 

7、<T> Future<T> submit(Runnable task, T result) 

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

參數: task - 要提交的任務 result - 返回的結果

返回: 表示任務等待完成的 Future

拋出: RejectedExecutionException - 如果任務無法安排執行

              NullPointerException - 如果該任務爲 null

 

8、Future<?> submit(Runnable task)

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

參數:task - 要提交的任務

返回:表示任務等待完成的 Future

拋出:RejectedExecutionException - 如果任務無法安排執行

           NullPointerException - 如果該任務爲 null

 

9、<T> List<Future<T>> invokeAll(Collection<? extends Callable<T>> tasks) throws InterruptedException

執行給定的任務,當所有任務完成時,返回保持任務狀態和結果的 Future 列表。返回列表的所有元素的Future.isDone() 爲true。注意,可以正常地或通過拋出異常來終止已完成 任務。如果正在進行此操作時修改了給定的 collection,則此方法的結果是不確定的。

參數:tasks - 任務 collection

返回:表示任務的 Future 列表,列表順序與給定任務列表的迭代器所生成的順序相同,每個任務都已完成。

拋出:InterruptedException - 如果等待時發生中斷,在這種情況下取消尚未完成的任務。

NullPointerException - 如果任務或其任意元素爲 null

RejectedExecutionException - 如果所有任務都無法安排執行

 

10、<T> List<Future<T>> invokeAll(Collection<? extends Callable<T>> tasks, long timeout, TimeUnit unit) throws InterruptedException

執行給定的任務,當所有任務完成或超時期滿時(無論哪個首先發生),返回保持任務狀態和結果的 Future 列表。返回列表的所有元素的 Future.isDone() 爲true。一旦返回後,即取消尚未完成的任務。注意,可以正常地或通過拋出異常來終止已完成 任務。如果此操作正在進行時修改了給定的 collection,則此方法的結果是不確定的。

參數:tasks - 任務 collection    timeout - 最長等待時間    unit - timeout 參數的時間單位

返回:表示任務的 Future 列表,列表順序與給定任務列表的迭代器所生成的順序相同。如果操作未超時,則已完成所有任務。如果確實超時了,則某些任務尚未完成。

拋出:InterruptedException - 如果等待時發生中斷,在這種情況下取消尚未完成的任務

      NullPointerException - 如果任務或其任意元素或 unit 爲 null

      RejectedExecutionException - 如果所有任務都無法安排執行

 

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

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

參數:tasks - 任務 collection

返回:某個任務返回的結果

拋出:InterruptedException - 如果等待時發生中斷

      NullPointerException - 如果任務或其任意元素爲 null

      IllegalArgumentException - 如果任務爲空

      ExecutionException - 如果沒有任務成功完成

      RejectedExecutionException - 如果任務無法安排執行

 

12、<T> T invokeAny(Collection<? extends Callable<T>> tasks, long timeout, TimeUnit unit) throws InterruptedException, ExecutionException, TimeoutException

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

參數: tasks - 任務 collection     timeout - 最長等待時間  unit - timeout 參數的時間單位

返回: 某個任務返回的結果

拋出: InterruptedException - 如果等待時發生中斷

      NullPointerException - 如果任務或其任意元素或 unit 爲 null

      TimeoutException - 如果在所有任務成功完成之前給定的超時期滿

      ExecutionException - 如果沒有任務成功完成

      RejectedExecutionException - 如果任務無法安排執行

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章