1. 程式人生 > >29-非同步任務提交執行架構

29-非同步任務提交執行架構

  1. 非同步任務提交執行架構
    1. 類關係圖

    1. 示例:執行緒池提交Runnable任務

    1. 示例:執行緒池提交Callable任務

    1. Executor  執行緒提交介面

Executor(Runnable c):將Runnable任務提交到執行緒池中

    1. ExecutorService  執行緒池介面
      1. 提交非同步任務方法:
  1. execute
    (Runnable c): 向執行緒池中提交任務。
  2. Future<?> submit(Runnable task)   <T> Future<T> submit(Callable<T> task) 

 向執行緒池中提交任務。區別在於Runnable在執行完畢後沒有結果,Callable執行完畢後有一個結果。相同點在於都返回一個Future物件(可以阻塞執行緒直到執行完畢,也可以取消任務執行,也能夠檢測任務是否被取消或者是否執行完畢)。

      1. execute()
         submit()的區別

Executor()的入參可以為Runnable以及Callable物件,同時又返回值;

當外部需要對執行緒丟擲的異常進行捕獲處理時,使用submit()方式提交,客通過Future.get()捕獲。

    1. ScheduledExecutorService 定時排程介面

和Timer/TimerTask類似,用於解決重複執行的任務

    1.  ThreadPoolExecutor 執行緒池類
      1. 構造方法1

keepAliveTime:當執行緒數大於core數,那麼超過該時間的執行緒將會被終結。

workQueue若執行緒池已經被佔滿,則該佇列用於存放無法再放入執行緒池中的Runnable。

      1.  構造方法2

ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit,BlockingQueue<Runnable> workQueue, RejectedExecutionHandler handler)

其中handler表示執行緒池對拒絕任務的處理策略。

      1. 使用注意事項

若執行緒池中的執行緒數量小於corePoolSize,即使執行緒池中的執行緒都處於空閒狀態,也要建立新的執行緒來處理被新增的任務。

若執行緒池中的執行緒數量等於corePoolSize且緩衝佇列workQueue未滿,則任務被放入緩衝佇列。

若執行緒池中執行緒的數量大於corePoolSize且緩衝佇列workQueue滿,且執行緒池中的數量小於maximumPoolSize,則建新的執行緒來處理被新增的任務。

若執行緒池中執行緒的數量大於corePoolSize且緩衝佇列workQueue滿,且執行緒池中的數量等於maximumPoolSize,那麼通過handler所指定的策略來處理此任務。

當執行緒池中的執行緒數量大於corePoolSize時,如果某執行緒空閒時間超過keepAliveTime,執行緒將被終止。

    1.  Executors 工廠

提供靜態方法,用於建立ExecutorService執行緒池,其實質呼叫的是ThreadPoolExecutor的構造器。

      1. 單執行緒的執行緒池newSingleThreadExecutor(...)

這個執行緒池只有一個執行緒在工作,線上程處理完一個任務後接著處理下一個任務,若該執行緒出現異常,將會有一個新的執行緒來替代。此執行緒池保證所有任務的執行順序按照任務的提交順序執行。

      1. 建立固定大小的執行緒池 newFixedThreadPool(...)

每次提交一個任務就建立一個執行緒,直到執行緒達到執行緒池的最大大小,達到最大值就會保持不變,如果某個執行緒因為執行異常而結束,那麼執行緒池會補充一個新執行緒。

      1. 可根據需要建立新執行緒的執行緒池 newCachedThreadPool(...)

 當執行緒池大小超過了需要處理任務需要的執行緒時,會自動回收空閒執行緒(60秒)。當任務增加時,會自動的新增新的執行緒來處理,執行緒池的大小取決於jvm能建立的最大執行緒的大小。容易導致記憶體不足。

      1. 大小不限的定時排程的執行緒池 newScheduledThreadPool(...)

 建立一個執行緒池,它可安排在給定延遲後執行命令或者定期地執行。

      1. 單執行緒的定時排程的執行緒池newSingleThreadScheduledExecutor()

建立一個使用單個 worker 執行緒的 Executor,以無界佇列方式來執行該執行緒,並在需要時使用提供的 ThreadFactory 建立新執行緒。

 

    1. 執行緒池的生命週期
      1. 啟動執行緒池

執行緒池被構造完成之後,進入可執行狀態;在接到任務後,進入執行狀態。

      1. 關閉執行緒池
        1. shutdown():平緩的關閉執行緒池。

執行緒池停止接受新的任務,同時等待已經提交的任務執行完畢,包括那些進入佇列還沒有開始的任務。shutdown()方法執行過程中,執行緒池處於SHUTDOWN狀態。

        1. shutdownNow():立即關閉執行緒池。

執行緒池停止接受新的任務,取消所有執行的任務和已經進入佇列但是還沒有執行的任務。

shutdownNow()方法執行過程中,執行緒池處於STOP狀態。

shutdownNow方法本質是呼叫Thread.interrupt()方法(讓執行緒處於interrupted狀態,並不會讓執行緒真正的停止)。執行緒中必須要有處理interrupt事件的機制才能停止執行緒。

      1. 執行緒池結束TERMINATED 

即shutdown()或者shutdownNow()執行完畢,執行緒池就結束了(terminated)。

isTerminating() 如果關閉後所有任務都已完成,則返回 true。

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