大家好,我是Mic,一個作業了14年的Java程式員,
最近很多小伙伴私信我,讓我說一些執行緒池相關的問題,
執行緒池這個方向考察的點還挺多的,如果只是靠刷面試題
面試官很容易就能識別出來,我隨便舉幾個,
- 執行緒池是如何實作執行緒的回收的
- 核心執行緒是否能夠回收
- 當呼叫執行緒池的shutdown方法,會發生什么?
面試一定是連環問,從而確定求職者對這個領域的理解程度,
關于執行緒池回收相關的問題,高手部分的回答我整理到了一個20W字的面試檔案里面大家可以私信我領取,
下面看看高手的回答
高手:
首先,執行緒池里面分為核心執行緒和非核心執行緒,
核心執行緒是常駐在執行緒池里面的作業執行緒,它有兩種方式初始化,
- 向執行緒池里面添加任務的時候,被動初始化
- 主動呼叫
prestartAllCoreThreads方法
當執行緒池里面的佇列滿了的情況下,為了增加執行緒池的任務處理能力,
執行緒池會增加非核心執行緒,
核心執行緒和非核心執行緒的數量,是在構造執行緒池的時候設定的,也可以動態進行更改,
由于非核心執行緒是為了解決任務過多的時候臨時增加的,所以當任務處理完成后,作業執行緒處于空閑狀態的時候,就需要回收,
因為所有作業執行緒都是從阻塞佇列中去獲取要執行的任務,所以只要在一定時間內,阻塞佇列沒有任何可以處理的任務,那這個執行緒就可以結束了,
這個功能是通過阻塞佇列里面的poll方法來完成的,這個方法提供了超時時間和超時時間單位這兩個引數當超過指定時間沒有獲取到任務的時候,poll方法回傳null,從而終止當前執行緒完成執行緒回收,
默認情況下,執行緒池只會回收非核心執行緒,如果希望核心執行緒也要回收,可以設定allowCoreThreadTimeOut這個屬性為true,一般情況下我們不會去回收核心執行緒,
因為執行緒池本身就是實作執行緒的復用,而且這些核心執行緒在沒有任務要處理的時候是處于阻塞狀態并沒有占用CPU資源,
總結
關于執行緒池,是每一個Java程式員必須要深度掌握的內容,
它很重要,在我們的應用系統中,無處不在體現執行緒,
包括在應用開發中,也難免會用到執行緒池,
掌握好它能夠寫出更加健壯性和穩定性的程式,
大家記得點贊、收藏加關注
著作權宣告:本博客所有文章除特別宣告外,均采用 CC BY-NC-SA 4.0 許可協議,轉載請注明來自
Mic帶你學架構!
如果本篇文章對您有幫助,還請幫忙點個關注和贊,您的堅持是我不斷創作的動力,歡迎關注「跟著Mic學架構」公眾號公眾號獲取更多技術干貨!

轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/501059.html
標籤:其他
