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