【Java面試】簡述一下你對執行緒池的理解?

語言: CN / TW / HK

到底是什麼面試題,

讓一個工作了4年的精神小夥,只是去參加了一場技術面試,

就被搞得精神萎靡。鬱鬱寡歡!

這一切的背後到底是道德的淪喪,還是人性的扭曲。

讓我們一起揭祕一下這道面試題。

關於, “簡述你對執行緒池的理解”,看看普通人和高手的回答。

普通人:

嗯。。。。。。。。。。

高手:

關於這個問題,我會從幾個方面來回答。

首先,執行緒池本質上是一種池化技術,而池化技術是一種資源複用的思想,比較常見的有連線池、記憶體池、物件池。

而執行緒池裡面複用的是執行緒資源,它的核心設計目標,我認為有兩個:

  1. 減少執行緒的頻繁建立和銷燬帶來的效能開銷,因為執行緒建立會涉及到CPU上下文切換、記憶體分配等工作。

  2. 執行緒池本身會有引數來控制執行緒建立的數量,這樣就可以避免無休止的建立執行緒帶來的資源利用率過高的問題,

起到了資源保護的作用。

其次,我簡單說一下執行緒池裡面的執行緒複用技術。因為執行緒本身並不是一個受控的技術,也就是說執行緒的生命週期時由任務執行的狀態決定的,無法人為控制。

所以為了實現執行緒的複用,執行緒池裡面用到了阻塞佇列,簡單來說就是執行緒池裡面的工作執行緒處於一直執行狀態,它會從阻塞佇列中去獲取待執行的任務,一旦佇列空了,那這個工作執行緒就會被阻塞,直到下次有新的任務進來。

也就是說,工作執行緒是根據任務的情況實現阻塞和喚醒,從而達到執行緒複用的目的。

最後,執行緒池裡面的資源限制,是通過幾個關鍵引數來控制的,分別是核心執行緒數、最大執行緒數。

核心執行緒數表示預設長期存在的工作執行緒,而最大執行緒數是根據任務的情況動態建立的執行緒,主要是提高阻塞佇列中任務的

處理效率。image-20220422153602866

以上就是我對這個問題的理解!

總結

我當時在閱讀執行緒池的原始碼的時候,被裡面的各種設計思想驚豔到了。

比如動態擴容和縮容的思想、執行緒的複用思想、以及執行緒回收的方法等等。

我發現越是簡單的東西,反而越不簡單。

更多的面試資料和麵試技巧,可以私信我獲取。

file

版權宣告:本部落格所有文章除特別宣告外,均採用 CC BY-NC-SA 4.0 許可協議。轉載請註明來自 Mic帶你學架構! 如果本篇文章對您有幫助,還請幫忙點個關注和贊,您的堅持是我不斷創作的動力。歡迎關注同名微信公眾號獲取更多技術乾貨!