執行緒池的推薦設定

2021-10-24 15:21:50 字數 2402 閱讀 2876

一、threadpoolexecutor的重要引數

corepoolsize:核心執行緒數

核心執行緒會一直存活,及時沒有任務需要執行

當執行緒數小於核心執行緒數時,即使有執行緒空閒,執行緒池也會優先建立新執行緒處理

設定allowcorethreadtimeout=true(預設false)時,核心執行緒會超時關閉

queuecapacity:任務佇列容量(阻塞佇列)

當核心執行緒數達到最大時,新任務會放在佇列中排隊等待執行

maxpoolsize:最大執行緒數

當執行緒數》=corepoolsize,且任務佇列已滿時。執行緒池會建立新執行緒來處理任務

當執行緒數=maxpoolsize,且任務佇列已滿時,執行緒池會拒絕處理任務而丟擲異常

keepalivetime:執行緒空閒時間

當執行緒空閒時間達到keepalivetime時,執行緒會退出,直到執行緒數量=corepoolsize

如果allowcorethreadtimeout=true,則會直到執行緒數量=0

allowcorethreadtimeout:允許核心執行緒超時

rejectedexecutionhandler:任務拒絕處理器

兩種情況會拒絕處理任務:

當執行緒數已經達到maxpoolsize,切佇列已滿,會拒絕新任務

當執行緒池被呼叫shutdown()後,會等待執行緒池裡的任務執行完畢,再shutdown。如果在呼叫shutdown()和執行緒池真正shutdown之間提交任務,會拒絕新任務

執行緒池會呼叫rejectedexecutionhandler來處理這個任務。如果沒有設定預設是abortpolicy,會丟擲異常

threadpoolexecutor類有幾個內部實現類來處理這類情況:

abortpolicy 丟棄任務,拋執行時異常

callerrunspolicy 執行任務

discardpolicy 忽視,什麼都不會發生

discardoldestpolicy 從佇列中踢出最先進入佇列(最後乙個執行)的任務

實現rejectedexecutionhandler介面,可自定義處理器

二、threadpoolexecutor執行順序:

執行緒池按以下行為執行任務

當執行緒數小於核心執行緒數時,建立執行緒。

當執行緒數大於等於核心執行緒數,且任務佇列未滿時,將任務放入任務佇列。

當執行緒數大於等於核心執行緒數,且任務佇列已滿

若執行緒數小於最大執行緒數,建立執行緒

若執行緒數等於最大執行緒數,丟擲異常,拒絕任務

三、如何設定引數

預設值corepoolsize=1

queuecapacity=integer.max_value

maxpoolsize=integer.max_value

keepalivetime=60s

allowcorethreadtimeout=false

rejectedexecutionhandler=abortpolicy()

如何來設定

需要根據幾個值來決定

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採用預設通常能滿足

以上都是理想值,實際情況下要根據機器效能來決定。如果在未達到最大執行緒數的情況機器cpu load已經滿了,則需要通過公升級硬體(呵呵)和優化**,降低taskcost來處理。

執行緒池設定 如何合理設定執行緒池的核心執行緒數?

當執行緒池的核心執行緒數量過大或者過小有沒影響?如何合理地設定執行緒池的核心執行緒的數量?這個是在日常開發中程式設計師在使用執行緒池時經常需要考慮的問題,下面具體介紹下。1 當執行緒池的核心執行緒數量過大或者過小的影響 當執行緒池中核心執行緒數量過大時,執行緒與執行緒之間會爭取cpu資源,這樣就會導...

多執行緒 設定執行緒池執行緒數量

一 需求 web server通常有個配置,最大工作執行緒數,後端服務一般也有個配置,工作執行緒池的執行緒數量,這個執行緒數的配置不同的業務架構師有不同的經驗值,有些業務設定為cpu核數的2倍,有些業務設定為cpu核數的8倍,有些業務設定為cpu核數的32倍。工作執行緒數 的設定依據是什麼,到底設定...

執行緒池 合理的設定大小

直接建立大量執行緒的壞處 對於乙個web伺服器,伺服器應用程式會處理來自客戶端的請求。假設,每到達乙個請求,我們的程式都為該請求建立乙個執行緒來執行請求任務,那麼這個建立的執行緒數目將會是無窮無盡的,為每乙個請求任務分配乙個執行緒 該做法是存在一些缺陷的,尤其是建立大量執行緒時 1 執行緒的生命週期...