1. 程式人生 > >ThreadPoolExecutor詳解(不看後悔,一看必懂)

ThreadPoolExecutor詳解(不看後悔,一看必懂)

構造器引數分析

第四個構造器原始碼

corePoolSize:核心池的大小

預設情況下,在建立了執行緒池後,執行緒池中的執行緒數為0,當有任務來之後,就會建立一個執行緒去執行任務,當執行緒池中的執行緒數數目少於corePoolSize時,有新任務進來就新建一個執行緒,即使有的執行緒沒事幹,當執行緒池中的執行緒數目達到corePoolSize時,將到達的任務放在快取佇列中

可以理解為:佇列沒滿時,執行緒最大併發數

maximumPoolSize:執行緒池最多執行緒數

表示線上程池中最多能建立多少個執行緒

可以理解為:佇列滿後,執行緒能夠達到的最大併發數

keepAliveTime:空閒執行緒過多久被回收的時間限制

預設情況下,只有當執行緒池中的執行緒數大於corePoolSize時,keepAliveTime才會起作用,直到執行緒池中的執行緒數不大於corePoolSize

unit:keepAliveTime的時間單位

workQueue:阻塞佇列,用來存放待執行的任務

SynchronousQueue(不儲存任務,直接提交佇列,也是無界)

工作佇列的預設選項是 SynchronousQueue,它將任務直接提交給執行緒而不保持它們。在此,如果不存在可用於立即執行任務的執行緒,則試圖把任務加入佇列將失敗,因此會構造一個新的執行緒。此策略可以避免在處理可能具有內部依賴性的請求集時出現鎖。直接提交通常要求無界 maximumPoolSizes 以避免拒絕新提交的任務。

ArrayBlockingQueue(有界佇列,基於陣列,先進先出)

LinkedBlockingQueue(無界佇列,基於連結串列,先進先出)

threadFactory:執行緒工廠,用來建立新執行緒

handler:飽和策略

當佇列和執行緒池都滿了(也就是說超過了maximumPoolSiz和workQueue),說明執行緒池處於飽和狀態,那麼必須採用一種策略來處理新任務

當然也可以根據具體場景需要實現RejectedExecutionHandler介面來自定義策略,如記錄日誌或持久化不能處理的任務

構造器的使用

newSingleThreadExecutor-->單執行緒執行緒池

newFixedThreadExecutor(n)-->固定數量執行緒池

newCacheThreadExecutor(推薦使用)-->快取執行緒池

newScheduleThreadExecutor

大小無限制的執行緒池,支援定時和週期性的執行執行緒

常用方法之向執行緒池提交任務

提交不需要返回值的任務

提交需要返回值的任務

常用方法之關閉執行緒池