天天看點

java中ExecutorService接口

随時随地閱讀更多技術實戰幹貨,擷取項目源碼、學習資料,請關注源代碼社群公衆号(ydmsq666)、QQ技術交流群(183198395)。

java中ExecutorService接口
java中ExecutorService接口
java中ExecutorService接口

一、聲明

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

所有超級接口:Executor

所有已知子接口:ScheduledExecutorService

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

二、概述

Executor

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

Future

的方法。

可以關閉 ExecutorService,這将導緻其拒絕新任務。提供兩個方法來關閉 ExecutorService。

shutdown()

方法在終止前允許執行以前送出的任務,而

shutdownNow()

方法阻止等待任務啟動并試圖停止目前正在執行的任務。在終止時,執行程式沒有任務在執行,也沒有任務在等待執行,并且無法送出新任務。應該關閉未使用的ExecutorService 以允許回收其資源。

通過建立并傳回一個可用于取消執行和/或等待完成的

Future

,方法 submit 擴充了基本方法

Executor.execute(java.lang.Runnable)

。方法 invokeAny 和 invokeAll 是批量執行的最常用形式,它們執行任務 collection,然後等待至少一個,或全部任務完成(可使用

ExecutorCompletionService

類來編寫這些方法的自定義變體)。

Executors

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

下面給出了一個網絡服務的簡單結構,這裡線程池中的線程作為傳入的請求。它使用了預先配置的

Executors.newFixedThreadPool(int)

工廠方法:

class NetworkService implements Runnable {
    private final ServerSocket serverSocket;
    private final ExecutorService pool;

    public NetworkService(int port, int poolSize)
        throws IOException {
      serverSocket = new ServerSocket(port);
      pool = Executors.newFixedThreadPool(poolSize);
    }
 
    public void run() { // run the service
      try {
        for (;;) {
          pool.execute(new Handler(serverSocket.accept()));
        }
      } catch (IOException ex) {
        pool.shutdown();
      }
    }
  }

  class Handler implements Runnable {
    private final Socket socket;
    Handler(Socket socket) { this.socket = socket; }
    public void run() {
      // read and service request on socket
    }
 }
           

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

void shutdownAndAwaitTermination(ExecutorService pool) {
   pool.shutdown(); // Disable new tasks from being submitted
   try {
     // Wait a while for existing tasks to terminate
     if (!pool.awaitTermination(60, TimeUnit.SECONDS)) {
       pool.shutdownNow(); // Cancel currently executing tasks
       // Wait a while for tasks to respond to being cancelled
       if (!pool.awaitTermination(60, TimeUnit.SECONDS))
           System.err.println("Pool did not terminate");
     }
   } catch (InterruptedException ie) {
     // (Re-)Cancel if current thread also interrupted
     pool.shutdownNow();
     // Preserve interrupt status
     Thread.currentThread().interrupt();
   }
 }
           

記憶體一緻性效果:線程中向

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

- 如果任務無法安排執行