ThreadPoolExecutor的不確定性

2021-08-25 10:13:02 字數 2159 閱讀 8028

網上介紹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研討會表...