執行緒池的種類
ThreadPoolExector 自定義執行緒池
引數
ThreadPoolExector的引數
引數名稱 | 說明 | 其他 |
---|---|---|
核心執行緒數 | 執行緒池核心執行緒數量,核心執行緒不會被回收,即使沒有任務執行,也會保持空閒狀態 | |
最大執行緒數 | 池允許最大的執行緒數,當執行緒數量達到corePoolSize,且workQueue佇列塞滿任務了之後,繼續建立執行緒。 |
"Isn't this fun?" |
keepAliveTime 保持時間 | 超過corePoolSize之後的“臨時執行緒”的存活時間 |
|
unit 保持時間 | keepAliveTime的單位 |
|
workQueue 阻塞佇列大小 | 當前執行緒數超過corePoolSize時,新的任務會處在等待狀態,並存在workQueue中,BlockingQueue是一個先進先出的阻塞式佇列實現,底層實現會涉及Java併發的AQS機制 |
|
threadFactory | 建立執行緒的工廠類,通常我們會自頂一個threadFactory設定執行緒的名稱,這樣我們就可以知道執行緒是由哪個工廠類建立的,可以快速定位 |
|
handler 拒絕策略 | 1、AbortPolicy:為執行緒池預設的拒絕策略,該策略直接拋異常處理2、DiscardOldestPolicy:丟棄佇列中最老的任務3、CallerRunsPolicy:將任務分配給當前執行execute方法執行緒來處理4、DiscardOldestPolicy:丟棄佇列中最老的任務 |
自定義拒絕策略,只需要實現RejectedExecutionHandler介面即可 |
使用說明
-
核心執行緒數 :執行緒長時間維持的執行緒數量,預設情況下會在新建執行緒池後根據執行緒任務來初始化執行緒,到達核心執行緒數位置,核心執行緒不會被回收。開發者可以使用prestartCoreThread發放跳過初始化執行緒的過程,直接初始化核心執行緒。當核心執行緒都在工作,且workQueue滿了的情況下會建立新的執行緒來執行任務。
-
最大執行緒數 :執行緒池允許最多同時進行處理任務的最大執行緒個數 = 核心執行緒數 + 額外執行緒,額外執行緒是會被回收的,具體的回收策略參考後面講解的引數keepAliveTime 、unit。
-
keepAliveTime、unit:保持時間,額外執行緒的過期時間
-
workQueue:執行緒任務佇列,一般會使用BlockingQueue
-
threadFactory:執行緒工廠類,通常我們會自頂一個threadFactory設定執行緒的名稱,這樣我們就可以知道執行緒是由哪個工廠類建立的,可以快速定位
-
handler:拒絕策略,在佇列滿了之後,新的任務請求進行的處理策略,可以自己實現儲存在mysql裡面或者其他的操作。
Executors建立的執行緒池
名稱 | 說明 | 實現 | 需要關注點 |
---|---|---|---|
newFixedThreadPool | 固定執行緒數的執行緒池 | 核心執行緒數=最大執行緒數 ,使用LinkedBlockingQueue | |
newSingleThreadExecutor | 單一執行緒的執行緒池 | 核心執行緒數=最大執行緒數=1 ,使用LinkedBlockingQueu | |
newCachedThreadPool | 快取執行緒池 | 核心執行緒數=0,最大執行緒數為Integer的最大值,過期時間為60s,使用容器SynchronousQueue | |
newScheduledThreadPool | 定時器執行緒池 | 核心執行緒數自定義,最大執行緒數為Integer的最大值,過期時間為0,使用容器DelayedWorkQueue |
ForkJoinPool執行緒池
使用分拆的思路,將任務進行分解成小的任務,進行任務處理的優化,並且能夠實現執行緒竊取,使用雙端佇列讓執行緒與執行緒間能夠共享任務。具體下篇分析下。