天天看點

ThreadPoolExecutor參數設定

1-首先預估系統負載,需要以下幾個值:

tasks :每秒的任務數,假設為50~100

taskTime:每個任務花費時間,假設為0.1s

responseTime:系統允許容忍的最大響應時間,假設為30s

2-計算

1)corePoolSize

每個任務需要taskTime秒處理,則每個線程每秒可處理1/taskTime個任務。系統每秒有tasks個任務需要處理,則需要的線程數為:

threadcount = tasks/(1/taskTime) = tasks*taskTime = (10~20)*0.05 = 5~10

根據計算可知,corePoolSize設定應該大于5小于10。

具體數字最好根據80/20原則,即80%情況下系統每秒任務數,若系統80%的情況下每秒任務數小于80,最多時為100,則corePoolSize可設定為8即可。

2)queueSize

任務隊列的長度要根據核心線程數,以及系統對任務響應時間的要求有關。隊列長度可以設定為

queueSize = (corePoolSize/taskTime)*responseTime = (8/0.1) * 30 = 2400

根據計算可知,隊列長度可設定為2400

另外需要注意的是,隊列長度設定過大,會導緻任務響應時間過長,切忌将隊列長度設定為Integer.MAX_VALUE,将會導緻線程數量永遠為corePoolSize,再也不會增加,當任務數量陡增時,任務響應時間也将随之陡增。

3)maxPoolSize

當系統負載達到最大值時,核心線程數已無法按時處理完所有任務,這時就需要增加線程。每秒送出過來80個任務沒問題,但是某段高峰時期達到了最大任務數,每一秒多送出了20個任務,達到了100個任務,每秒多出的20個任務需要在responseTime内處理完畢

maxPoolSize = ( max(tasks) - 80%(tasks) ) / responseTime / (1/taskTime) + corePoolSize = (100-80)/ 30 / (1/0.1) + 8 = 15

有上面的計算可知,最大線程數可設定為 15

4)keepAliveTime:

當負載降低時,可減少線程數量,如果一個線程空閑時間達到keepAliveTiime,該線程就退出。此值在對資源不敏感情況下預設設定即可。