1. 介紹
用來建立線程池
2. 參數說明
參數 | 說明 |
corePoolSize | 核心線程數 |
maximumPoolSize | 最大線程數 |
keepAliveTime | 超過corePoolSize,allowCoreThreadTimeOut(true)也可以設定核心線程數的逾時時間 |
TimeUnit | keepAliveTime時間機關 |
workQueue | 阻塞任務隊列 |
threadFactory | 線程工廠 |
RejectedExecutionHandler | 線程超過maximumPoolSize+workQueue數量和時的拒絕政策 |
具體說明:
corePoolSize
: 建立線程池後,預設情況下沒有線程,有任務到來時才會逐個建立線程去執行,可以顯示調用prestartAllCoreThreads()或者prestartCoreThread()來建立所有核心線程或一個線程
maximumPoolSize
:最大線程數,當核心線程corePoolSize已滿,阻塞隊列workQueue已滿時,會建立線程,直到最大線程數,若還有線程,表明超出線程池處理能力,會走拒絕政策RejectedExecutionHandler
keepAliveTime
:當線程空閑時間達到keepAliveTime時,線程會被銷毀,直到corePoolSize數量,如果如果allowCoreThreadTimeout設定為true,則核心線程空閑逾時也會退出
workQueue
:阻塞隊列,核心線程數滿時,任務會放入阻塞隊列,阻塞隊列滿時,會建立新線程直到maximumPoolSize數量。線程池的排隊政策與阻塞隊列有關,可以看下
java.util.concurrent.BlockingQueue
的實作類,常用這幾種:
;
LinkedBlockingQueue;
SynchronousQueue;
threadFactory
: 線程工程,用來建立線程
RejectedExecutionHandler
:任務超過maximumPoolSize+workQueue數量和時,要怎麼做?
ThreadPoolExecutor.CallerRunsPolicy:由調用線程處理該任務
ThreadPoolExecutor.AbortPolicy:拒絕任務并抛出RejectedExecutionException異常。
ThreadPoolExecutor.DiscardPolicy:拒絕任務,隻是忽略掉任務,但是不抛出異常。
ThreadPoolExecutor.DiscardOldestPolicy:丢棄隊列最前面的未處理的任務,然後重試執行任務
3. 參數設定
corePoolSize
: 假設處理每個任務需要taskTime秒,每個線程每秒可以處理1/taskTime個任務。如果系統每秒有tasks個任務需要處理,則需要的線程數為tasks/(1/taskTime) = tasks*taskTime。假設系統每秒任務數為100~1000,處理每個任務0.1秒,即10-100個線程,則corePoolSize應該大于10,根據場景,具體定多少核心線程。
workQueue長度
:隊列的長度要根據核心線程數以及系統對任務的響應時間設定,corePoolSize核心線程數每秒處理任務數量:corePoolSize*(1/taskTime) = corePoolSize/taskTime,再乘以響應時間(機關s):corePoolSize/taskTime*responseTime,為隊列最大長度。如果隊列過大,則響應時間過長,就會逾時。
corePoolSize:10,taskTime: 0.1s,responseTime:2s 則系統每秒能處理100個任務,在響應時間内的最大任務長度為200.
maxPoolSize
: 當任務達到最大長度後,系統無法核心線程無法完成所有任務,是以需要再建立線程,100個任務需要10個線程,則1000個任務(1000-workQueue)*(10/100) = 80,最大需要80個線程
(上面參數是在不考慮硬體資源的情況下)
*微信公衆号