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
大小無限制的執行緒池,支援定時和週期性的執行執行緒
常用方法之向執行緒池提交任務
提交不需要返回值的任務
提交需要返回值的任務