一、概述
dk1.5中引入了強大的concurrent包,其中最常用的莫過了執行緒池的實現threadpoolexecutor,它給我們帶來了極大的方便,但同時,對於該執行緒池不恰當的設定也可能使其效率並不能達到預期的效果,甚至僅相當於或低於單執行緒的效率。
threadpoolexecutor類可設定的引數主要有:
corepoolsize
核心執行緒數,核心執行緒會一直存活,即使沒有任務需要處理。當執行緒數小於核心執行緒數時,即使現有的執行緒空閒,執行緒池也會優先建立新執行緒來處理任務,而不是直接交給現有的執行緒處理。
核心執行緒在allowcorethreadtimeout被設定為true時會超時退出,預設情況下不會退出。
maxpoolsize
當執行緒數大於或等於核心執行緒,且任務佇列已滿時,執行緒池會建立新的執行緒,直到執行緒數量達到maxpoolsize。如果執行緒數已等於maxpoolsize,且任務佇列已滿,則已超出執行緒池的處理能力,執行緒池會拒絕處理任務而丟擲異常。
keepalivetime
當執行緒空閒時間達到keepalivetime,該執行緒會退出,直到執行緒數量等於corepoolsize。如果allowcorethreadtimeout設定為true,則所有執行緒均會退出直到執行緒數量為0。
allowcorethreadtimeout
是否允許核心執行緒空閒退出,預設值為false。
queuecapacity
任務佇列容量。從maxpoolsize的描述上可以看出,任務佇列的容量會影響到執行緒的變化,因此任務佇列的長度也需要恰當的設定。
執行緒池按以下行為執行任務
當執行緒數小於核心執行緒數時,建立執行緒。
當執行緒數大於等於核心執行緒數,且任務佇列未滿時,將任務放入任務佇列。
當執行緒數大於等於核心執行緒數,且任務佇列已滿
若執行緒數小於最大執行緒數,建立執行緒
若執行緒數等於最大執行緒數,丟擲異常,拒絕任務
系統負載
tasks,每秒需要處理的最大任務數量
tasktime,處理第個任務所需要的時間
responsetime,系統允許任務最大的響應時間,比如每個任務的響應時間不得超過2秒。
二、說細引數設定說明
1、預設值*corepoolsize=1*queuecapacity=integer.max_value以上關於執行緒數量的計算並沒有考慮cpu的情況。若結合cpu的情況,比如,當執行緒數量達到50時,cpu達到100%,則將maxpoolsize設定為60也不合適,此時若系統負載長時間維持在每秒1000個任務,則超出執行緒池處理能力,應設法降低每個任務的處理時間(tasktime)。*maxpoolsize=integer.max_value
*keepalivetime=60s*allowcorethreadtimeout=false*rejectedexecutionhandler=abortpolicy()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.1*1=80。意思是佇列裡的執行緒可以等待1s,超過了的需要新開執行緒來執行*切記不能設定為integer.max_value,這樣佇列會很大,執行緒數隻會保持在corepoolsize大小
,當任務陡增時,不能新開執行緒來執行,響應時間會隨之陡增。-maxpoolsize =(max(tasks)-queuecapacity)/(1/taskcost)*計算可得maxpoolsize =(1000-80)/10=92*(最大任務數-佇列容量)/每個執行緒每秒處理能力=最大執行緒數-rejectedexecutionhandler:根據具體情況來決定,任務不重要可丟棄,任務重要則要利用一些緩衝機制來處理-keepalivetime和allowcorethreadtimeout採用預設通常能滿足3、以上都是理想值,實際情況下要根據機器效能來決定。如果在未達到最大執行緒數的情況機器cpu load已經滿了
,則需要通過公升級硬體(呵呵)和優化**,降低taskcost來處理。
執行緒 執行緒池
執行緒池是一種多執行緒處理形式,處理過程中將任務新增到佇列,然後在建立執行緒後執行,主要實現 建立執行緒和管理執行緒,並且給執行緒分配任務。執行緒池中的執行緒是併發執行的。乙個比較簡單的執行緒池至少應包含執行緒池管理器 工作執行緒 任務列隊 任務介面等部分。其中執行緒池管理器的作用是建立 銷毀並管理...
執行緒 執行緒池
乙個簡單執行緒的建立和銷毀如下 與程序程序相比,執行緒是一種輕量級的工具,但是輕量並不代表沒有,它的建立和關閉依然需要花費時間,如果建立和銷毀的時間還大於執行緒本身完成的工作,那就會得不償失,甚至會造成out of memory。即使沒有,大量的執行緒 也會給gc帶來巨大的壓力。為了解決這樣的問題,...
mysql 執行緒池 c MySQL執行緒池
mysql執行緒池 在麼mysql中,執行緒池指的是用來管理處理mysql客戶端連線任務的執行緒的一種機制。如果把執行緒看做系統資源那麼執行緒池本質上是對系統資源的管理,對應作業系統來說執行緒的建立和銷毀是比較消耗系統資源的,頻繁的建立與銷毀執行緒必然給系統帶來不必要的資源浪費,特別是在高負載的情況...