到底是什麼面試題,
讓一個工作了4年的精神小夥,只是去參加了一場技術面試,
就被搞得精神萎靡。鬱鬱寡歡!
這一切的背後到底是道德的淪喪,還是人性的扭曲。
讓我們一起揭祕一下這道面試題。
關於, “簡述你對執行緒池的理解”,看看普通人和高手的回答。
普通人:
嗯。。。。。。。。。。
高手:
關於這個問題,我會從幾個方面來回答。
首先,執行緒池本質上是一種池化技術,而池化技術是一種資源複用的思想,比較常見的有連線池、記憶體池、物件池。
而執行緒池裡面複用的是執行緒資源,它的核心設計目標,我認為有兩個:
- 減少執行緒的頻繁建立和銷燬帶來的效能開銷,因為執行緒建立會涉及到CPU上下文切換、記憶體分配等工作。
執行緒池本身會有引數來控制執行緒建立的數量,這樣就可以避免無休止的建立執行緒帶來的資源利用率過高的問題,
起到了資源保護的作用。
其次,我簡單說一下執行緒池裡面的執行緒複用技術。因為執行緒本身並不是一個受控的技術,也就是說執行緒的生命週期時由任務執行的狀態決定的,無法人為控制。
所以為了實現執行緒的複用,執行緒池裡面用到了阻塞佇列,簡單來說就是執行緒池裡面的工作執行緒處於一直執行狀態,它會從阻塞佇列中去獲取待執行的任務,一旦佇列空了,那這個工作執行緒就會被阻塞,直到下次有新的任務進來。
也就是說,工作執行緒是根據任務的情況實現阻塞和喚醒,從而達到執行緒複用的目的。
最後,執行緒池裡面的資源限制,是通過幾個關鍵引數來控制的,分別是核心執行緒數、最大執行緒數。
核心執行緒數表示預設長期存在的工作執行緒,而最大執行緒數是根據任務的情況動態建立的執行緒,主要是提高阻塞佇列中任務的
處理效率。
以上就是我對這個問題的理解!
總結
我當時在閱讀執行緒池的原始碼的時候,被裡面的各種設計思想驚豔到了。
比如動態擴容和縮容的思想、執行緒的複用思想、以及執行緒回收的方法等等。
我發現越是簡單的東西,反而越不簡單。
更多的面試資料和麵試技巧,可以私信我獲取。
版權宣告:本部落格所有文章除特別宣告外,均採用 CC BY-NC-SA 4.0 許可協議。轉載請註明來自Mic帶你學架構
!
如果本篇文章對您有幫助,還請幫忙點個關注和贊,您的堅持是我不斷創作的動力。歡迎關注同名微信公眾號獲取更多技術乾貨!