29-非同步任務提交執行架構
- 非同步任務提交執行架構
- 類關係圖
-
- 示例:執行緒池提交Runnable任務
-
- 示例:執行緒池提交Callable任務
-
- Executor 執行緒提交介面
Executor(Runnable c):將Runnable任務提交到執行緒池中
-
- ExecutorService 執行緒池介面
- 提交非同步任務方法:
- ExecutorService 執行緒池介面
- execute
- Future<?> submit(Runnable task) <T> Future<T> submit(Callable<T> task)
向執行緒池中提交任務。區別在於Runnable在執行完畢後沒有結果,Callable執行完畢後有一個結果。相同點在於都返回一個Future物件(可以阻塞執行緒直到執行完畢,也可以取消任務執行,也能夠檢測任務是否被取消或者是否執行完畢)。
-
-
- execute()
- execute()
-
Executor()的入參可以為Runnable以及Callable物件,同時又返回值;
當外部需要對執行緒丟擲的異常進行捕獲處理時,使用submit()方式提交,客通過Future.get()捕獲。
-
- ScheduledExecutorService 定時排程介面
和Timer/TimerTask類似,用於解決重複執行的任務
-
- ThreadPoolExecutor 執行緒池類
- 構造方法1
- ThreadPoolExecutor 執行緒池類
keepAliveTime:當執行緒數大於core數,那麼超過該時間的執行緒將會被終結。
workQueue若執行緒池已經被佔滿,則該佇列用於存放無法再放入執行緒池中的Runnable。
-
-
- 構造方法2
-
ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit,BlockingQueue<Runnable> workQueue, RejectedExecutionHandler handler)
其中handler表示執行緒池對拒絕任務的處理策略。
-
-
- 使用注意事項
-
若執行緒池中的執行緒數量小於corePoolSize,即使執行緒池中的執行緒都處於空閒狀態,也要建立新的執行緒來處理被新增的任務。
若執行緒池中的執行緒數量等於corePoolSize且緩衝佇列workQueue未滿,則任務被放入緩衝佇列。
若執行緒池中執行緒的數量大於corePoolSize且緩衝佇列workQueue滿,且執行緒池中的數量小於maximumPoolSize,則建新的執行緒來處理被新增的任務。
若執行緒池中執行緒的數量大於corePoolSize且緩衝佇列workQueue滿,且執行緒池中的數量等於maximumPoolSize,那麼通過handler所指定的策略來處理此任務。
當執行緒池中的執行緒數量大於corePoolSize時,如果某執行緒空閒時間超過keepAliveTime,執行緒將被終止。
-
- Executors 工廠
提供靜態方法,用於建立ExecutorService執行緒池,其實質呼叫的是ThreadPoolExecutor的構造器。
-
-
- 單執行緒的執行緒池newSingleThreadExecutor(...)
-
這個執行緒池只有一個執行緒在工作,線上程處理完一個任務後接著處理下一個任務,若該執行緒出現異常,將會有一個新的執行緒來替代。此執行緒池保證所有任務的執行順序按照任務的提交順序執行。
-
-
- 建立固定大小的執行緒池 newFixedThreadPool(...)
-
每次提交一個任務就建立一個執行緒,直到執行緒達到執行緒池的最大大小,達到最大值就會保持不變,如果某個執行緒因為執行異常而結束,那麼執行緒池會補充一個新執行緒。
-
-
- 可根據需要建立新執行緒的執行緒池 newCachedThreadPool(...)
-
當執行緒池大小超過了需要處理任務需要的執行緒時,會自動回收空閒執行緒(60秒)。當任務增加時,會自動的新增新的執行緒來處理,執行緒池的大小取決於jvm能建立的最大執行緒的大小。容易導致記憶體不足。
-
-
- 大小不限的定時排程的執行緒池 newScheduledThreadPool(...)
-
建立一個執行緒池,它可安排在給定延遲後執行命令或者定期地執行。
-
-
- 單執行緒的定時排程的執行緒池newSingleThreadScheduledExecutor()
-
建立一個使用單個 worker 執行緒的 Executor,以無界佇列方式來執行該執行緒,並在需要時使用提供的 ThreadFactory 建立新執行緒。
-
- 執行緒池的生命週期
- 啟動執行緒池
- 執行緒池的生命週期
執行緒池被構造完成之後,進入可執行狀態;在接到任務後,進入執行狀態。
-
-
- 關閉執行緒池
- shutdown():平緩的關閉執行緒池。
- 關閉執行緒池
-
執行緒池停止接受新的任務,同時等待已經提交的任務執行完畢,包括那些進入佇列還沒有開始的任務。shutdown()方法執行過程中,執行緒池處於SHUTDOWN狀態。
-
-
-
- shutdownNow():立即關閉執行緒池。
-
-
執行緒池停止接受新的任務,取消所有執行的任務和已經進入佇列但是還沒有執行的任務。
shutdownNow()方法執行過程中,執行緒池處於STOP狀態。
shutdownNow方法本質是呼叫Thread.interrupt()方法(讓執行緒處於interrupted狀態,並不會讓執行緒真正的停止)。執行緒中必須要有處理interrupt事件的機制才能停止執行緒。
-
-
- 執行緒池結束TERMINATED
-
即shutdown()或者shutdownNow()執行完畢,執行緒池就結束了(terminated)。
isTerminating() 如果關閉後所有任務都已完成,則返回 true。
isShutdown() 如果此執行程式已關閉,則返回 true。