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,該執行緒就退出。此值在對資源不敏感情況下預設設定即可。
ThreadPoolExecutor 引數解析
threadpoolexecutor 主要有以下幾個引數 public threadpoolexecutor int corepoolsize,int maximumpoolsize,long keepalivetime,timeunit unit,blockingqueueworkqueue,th...
ThreadPoolExecutor使用小結
記錄一下那幾個引數的理解,網上說了亂七八糟,詳細看參考文件,很詳細很明白,沒什麼好說的。corepoolsize,maximumpoolsize,keepalivetime keepalivetime workqueue queue blocksize 執行執行緒後,會判斷數量是否超出corepoo...
ThreadPoolExecutor簡單介紹
在專案中如果使用發簡訊這個功能,一般會把發簡訊這個動作變成非同步的,因為大部分情況下,簡訊到底是傳送成功或者失敗,都不能影響主流程。當然像傳送mq訊息等操作也是可以封裝成非同步操作的。如果想乙個操作變成非同步的,可以直接new thread,然後在run方法中實現業務操作即可。例如 new thre...