Java 線程池

四種經典線程池

1. newFixedThreadPool

newFixedThreadPool 將創建一個固定長度的線程池,每當提交一個任務時就創建一個新、線程,直到達到線程池的最大數量,這時線程池的規模將不再變化(如果某個線程由於發生了未預期的Exception而結束,那麼線程池會補充一個新的線程)。

2. newCachedThreadPool

newCachedThreadPool 將創建一個可緩存的線程池,如果線程池的當前規模超過了處理需求時,那麼將回收空閒的線程,而當需求增加時,則可以添加新的線程,線程池的規模不存在任何限制。

3. newSingleThreadExecutor

newSingleThreadExecutor 是一個單線程的
Executor,它創建單個工作者線程來執行任務,如果這個線程異常結束,會創建另一個線程來替代。newSingleThreadExecutor
能確保依照任務在隊列中的順序來串行執行(例如FIFO、LIFO、優先級)。

4. newScheduledThreadPool

newScheduledThreadPool 創建了一個固定長度的線程池,而且以延遲或定時的方式來執行任務,類似於Timer。

Executor 的生命週期

爲了解決執行服務的生命週期問題,Executor 擴展了 ExecutorService
接口,添加了一些用於生命週期管理的方法(同時還有一些用於任務提交的便利方法)。
ExecutorService 聲明週期有3種狀態:運行、關閉和終止。

  • shutdown 方法將執行平緩的的關閉過程:不再接受新的任務,同時等待已經提交提交的任務執行完成(包括那些還未開始執行的任務)。
  • shutdownNow 方法將執行粗暴的關閉過程:它將嘗試取消所有運行中的任務,並且不再啓動隊列中尚未開始執行的任務。

在 ExecutorService 關閉後,提交的任務將由“拒絕執行處理器(Rejected Execution
Handler)”來處理,它會拋棄任務,或者使得 execute 方法拋出一個未檢查的
RejectedExcutionException。等所有任務都完成後, ExecutorService 將轉讓終止狀態。可以調用
awaitTermination 來等待 ExecutorService 到達終止狀態,或者通過調用 isTerminated 來輪詢
ExecutorService 是否已經終止。通常在調用 awaitTermination 之後會立即調用
shutdown,從而產生同步的關閉 ExecutorService 的效果。

ExecutorService 實現類

AbstractExecutorService, ForkJoinPool, ScheduledThreadPoolExecutor, ThreadPoolExecutor

Timer 存在缺陷用 ScheduledThreadPoolExecutor 代替

  1. 定時精準性可以遭到破壞。
  2. 可能出現“線程泄露”。

參考資料

  • 《Java 併發編程實戰》ISBN 978-7-111-37004-8
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章