天天看點

Java線程池01之ThreadPoolExecutor

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個線程

(上面參數是在不考慮硬體資源的情況下)

*微信公衆号

繼續閱讀