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