執行緒池的各種使用場景

2021-10-01 23:41:39 字數 1255 閱讀 3468

(1)高併發、任務執行時間短的業務,執行緒池執行緒數可以設定為cpu核數+1,減少執行緒上下文的切換

(2)併發不高、任務執行時間長的業務要區分開看:

a)假如是業務時間長集中在io操作上,也就是io密集型的任務,因為io操作並不占用cpu,所以不要讓所有的cpu閒下來,可以加大執行緒池中的執行緒數目,讓cpu處理更多的業務

b)假如是業務時間長集中在計算操作上,也就是計算密集型任務,這個就沒辦法了,和(1)一樣吧,執行緒池中的執行緒數設定得少一些,減少執行緒上下文的切換

(3)併發高、業務執行時間長,解決這種型別任務的關鍵不在於執行緒池而在於整體架構的設計,看看這些業務裡面某些資料是否能做快取是第一步,增加伺服器是第二步,至於執行緒池的設定,設定參考(2)。最後,業務執行時間長的問題,也可能需要分析一下,看看能不能使用中介軟體對任務進行拆分和解耦

如何來設定

需要根據幾個值來決定

tasks :每秒的任務數,假設為500~1000

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

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

做幾個計算

corepoolsize = 每秒需要多少個執行緒處理?

threadcount = tasks/(1/taskcost) =tasks*taskcout = (500~1000)*0.1 = 50~100 個執行緒。corepoolsize設定應該大於50

根據8020原則,如果80%的每秒任務數小於800,那麼corepoolsize設定為80即可

queuecapacity = (coresizepool/taskcost)responsetime

計算可得 queuecapacity = 80/0.11 = 80。意思是佇列裡的執行緒可以等待1s,超過了的需要新開執行緒來執行

切記不能設定為integer.max_value,這樣佇列會很大,執行緒數隻會保持在corepoolsize大小,當任務陡增時,不能新開執行緒來執行,響應時間會隨之陡增。

maxpoolsize = (max(tasks)- queuecapacity)/(1/taskcost)(最大任務數-佇列容量)/每個執行緒每秒處理能力 = 最大執行緒數

計算可得 maxpoolsize = (1000-80)/10 = 92

rejectedexecutionhandler:根據具體情況來決定,任務不重要可丟棄,任務重要則要利用一些緩衝機制來處理

keepalivetime和allowcorethreadtimeout:採用預設通常能滿足

————————————————

執行緒池的種類和使用場景

newcachedthreadpool newfixedthreadpool newsinglethreadexecutor newscheduledthreadpool 執行緒池任務執行流程 當執行緒池小於corepoolsize時,新提交任務將建立乙個新執行緒執行任務,即使此時執行緒池中存在空閒...

執行緒池的方式與使用場景

1 newfixedthreadpool 建立固定大小的執行緒池。執行緒池的大小一旦達到最大值就會保持不變,如果某個執行緒異常結束,執行緒池會補充乙個新執行緒。2 newcashedthreadpool 建立可快取的執行緒池。如果執行緒池的大小超過了處理任務所需的執行緒,那麼就 部分空閒的執行緒 6...

執行緒池的種類,區別和使用場景

newcachedthreadpool public static executorservice newcachedthreadpool newfixedthreadpool public static executorservice newfixedthreadpool int nthreads...