本文主要介紹執行緒池是解決了哪些問題以及執行緒池中 的corepoolsize(核心執行緒數),queuecapacity(等待佇列的長度),maximumpoolsize(最大核心執行緒數)。本文不會對執行緒池各個引數介紹,假定你已經了解了執行緒池各個引數的含義。
當前實際應用中,經常會遇到單個請求處理時間短但請求量巨大但問題,簡單說就是qps很高,平響時間很短的情況。這些情況下如果採用來乙個任務就新建乙個執行緒處理,那麼會有什麼問題呢?
1、每個任務新建乙個執行緒,qps越高,就越消耗cpu資源新建執行緒;平響很短也需要cpu不斷的銷毀執行緒。從而會大量消耗cpu資源
3、每個執行緒的建立都是要消耗記憶體資源的。高qps情況下容易出現oom(unable to create new native thread)
4、作業系統本身也不允許執行緒無限對增長
基於以上4個問題,執行緒池應運而生。
執行緒池中核心執行緒數能夠重複使用,應對高qps無須頻繁新建執行緒,進而減少執行緒之間切換的耗時;阻塞佇列能夠暫時快取新到任務,作為新建執行緒的緩衝池。
先列出計算公式,然後舉例解釋說明
corepoolsize=20% * tasknum/(單執行緒/ar)=20% * 任務數 * 平響
tasknum是指任務數量/請求數量等,可以簡單理解成是qps,
ar是指每個任務的平均處理時間,
20%是根據8020定律得來的,簡單理解是80%的情況下,核心的任務數大約佔到20%
queuecapacity=(corepoolsize/ar)* mr
corepoolsize為上面計算出來的核心執行緒數,
ar是指每個任務的平均處理時間,
mr表示任務能夠接受的最大響應時間
maximumpoolsize=(tasknum-queuecapacity)/(單執行緒/ar)
tasknum是指任務數量/請求數量等,可以簡單理解成是qps,
queuecapacity為等待佇列的長度,
ar是指每個任務的平均處理時間,
假定任務數是100個/s,平均響應時間是0.1s,能夠接受的最大響應時間是0.5s則
corepoolsize=20% * tasknum/(單執行緒/ar)=20% * 任務數 * 平響=20% * 100 個/s * 0.1s=2個
queuecapacity=(corepoolsize/ar)* mr=2個/0.1s *0.5s=10個
maximumpoolsize=(tasknum-queuecapacity)/(單執行緒/ar)=(100-10)/(1/0.1)=9個
根據上面推到就能大致算出核心引數的取值,但是是有前提假定的,即資源是無限的。根據公式算出來的只是乙個理論參考值。實際線上引數配置還是要以此為基礎進行微調
執行緒池引數設定技巧
一 threadpoolexecutor的重要引數 queuecapacity 任務佇列容量 阻塞佇列 maxpoolsize 最大執行緒數 keepalivetime 執行緒空閒時間 allowcorethreadtimeout 允許核心執行緒超時 rejectedexecutionhandler...
執行緒池核心引數及引數設定
2.執行緒池引數設定 threadpoolexecutor是建立執行緒池的核心類,它定義了一些建構函式用來建立執行緒池,如下是它的其中乙個建構函式 public threadpoolexecutor int corepoolsize,int maximumpoolsize,long keepaliv...
執行緒池基礎,工作原理與引數設定
主要特點為 執行緒復用,控制最大併發數,管理執行緒。corepoolsize 執行緒池中的常駐核心執行緒數 maximumpoolsize 執行緒池能夠容納同時執行的最大執行緒數,此值必須大於1 keepalivetime 多餘的空閒執行緒存活時間。當前執行緒數量超過maximumpoolsize時...