網上介紹threadpoolexecutor的文章很多,這裡不再累述。threadpoolexecutor是doug lea的大作,但是只要是人寫的**都可能出現問題。
threadpoolexecutor是乙個具有動態彈性的執行緒池,其會自動根據業務的請求量來動態伸縮其內的執行緒數目(當然判斷的依據主要是corepoolsize、blockingqueue的size與maximumpoolsize的大小關係來決策,對於執行緒池這樣平台級的產物也只能按此標準了,想要按照業務自身特點的來控制線程的伸縮,需要繼承threadpoolexecutor自己實現了),
簡單說:
1、poolsize < corepoolsize 且執行緒池的狀態為running時,產生新的worker執行緒處理任務。
2、poolsize = corepoolsize 時,將任務放入阻塞佇列中,接著執行緒池會對volatile的runstate進行double check,
進而判斷剛剛加入佇列的任務是否能繼續呆在佇列中等待處理(有可能剛加入佇列,執行緒池就shutdown或者stop了)。
3、當佇列滿的時候,poolsize < maximumpoolsize, 執行緒池會增加執行緒來處理新的任務。最後當執行緒數達到
maximumpoolsize的時候,會根據拒絕策略來處理任務。
4、當佇列中沒有任務的時候,且執行緒池中存在空閒的執行緒(根據構建執行緒池傳入的keepalivetime作為到
blockingqueue獲取任務的超時時間),這樣執行緒池會收縮空閒執行緒到corepoolsize。
這是threadpoolexecutor工作的基本原理。我們知道執行緒建立有一定的開銷,這樣我們才使用池化的構件思想來處理這
種昂貴的物件資源,所以我們應該更加關注對已有執行緒的釋放,如果釋放不當,可能導致在需要的時候又會重複重新建立
已經建立過的執行緒,形成不必要的開銷。另外,如果執行緒池的伸縮策略不穩定,必然會影響業務的穩定性。那麼,
threadpoolexecutor真的能把空閒的執行緒降低到corepoolsize嗎?答案是半對半錯的,在某些情況下可以,在某些情況
下會低於該值,乃至於降低到零。問題的根源在於
threadpoolexecutor的gettask方法的實現:
runnable gettask()
// else retry
} catch (interruptedexception ie) }}
第10行**在某些場景下是有缺陷的,這裡不討論降低到corepoolsize的正常情況,我們**下另外的場景。
假設執行緒池的corepoolsize設定為3,阻塞對列為長度為3,maximumpoolsize的值為4,keepalivetime為1秒,
執行緒池一共接收了7個任務,執行緒池的快照如下:
假設當r1、r2、r3被處理完後(r7仍然在處理中),那麼corepoolsize執行緒去佇列中獲取r4、r5、r6任務進行處理,如下:
這樣當r4、r5、r6、r7任務都被處理完後,所有的執行緒(這裡為4)都會呼叫gettask方法到佇列中獲取新的任務,如
下:這樣,當所有的執行緒都執行到
else if (poolsize > corepoolsize || allowcorethreadtimeout)
r = workqueue.poll(keepalivetime, timeunit.nanoseconds);
的時候,poolsize > corepoolsize 都為true(因為poolsize與corepoolsize都是volatile的,每個執行緒都能獲取主存
的最新值),那麼當在佇列中等待keepalivetime後(這裡為1秒),所有的執行緒都將從佇列中得到乙個null值的返回,這樣在
後面的邏輯中,都將以null值作為gettask的返回。這樣每個worker執行緒都會退出自己的main loop,進而退出worker
的run方法(每個worker自身也是乙個runnable),最終執行緒池中的執行緒都降到零,而不是corepoolsize=3。
同時,使用threadpoolexecutor還要注意權衡corepoolsize、blockingqueue佇列的大小以及maximumpoolsize
三者的關係,否則使用threadpoolexecutor不當會給你的應用帶來意想不到的負面結果。
確定的現在,不確定的未來!
希望我們未來都能遇見更優秀 更快樂的自己!2020.02.29 由於疫情的影響,無法正常復工,只有偶爾去公司值班。最近也看了很多的文章,有關於疫情,有關於工作模式,有關於未來,說實話,看完以後還是蠻有壓力的,也是應該給自己一些憂患意識了,總結一下,大概有以下幾點 1 企業模式的未來 說到能力,這個太...
如何應對不確定
翻 譯 paula 審 校 ellesse chow 如果你下週開始新工作,要結婚,或者移居異國,你是不是感到心慌意亂?兩個月前,我的一位好朋友就經歷了這樣的恐慌。她接受了公司的安排到乙個遙遠的國家任職,但又無法對自己的決定安心。她不停地擔心會遠離家人朋友,也不知道能否適應當地的天氣,文化和食物等等...
CMMB的確定及不確定因素
cmmb 2008年奧運前曾經一度火爆,廣電不合時宜的推出ca加密系統,雖然從長遠看可能有利於手機電視的推廣,卻明顯導致了cmmb手機電視發展嘎然而止,出現 宣傳一頭熱,消費者不敢問津的局面。1 cmmb確定2009年7月1日正式試運營 廣電總局科技司副司長王聯在深圳國際積體電路展上cmmb研討會表...