有關這個系列的題目,我也糾結了一陣子。不知道該如何取名,本來想着叫「Java 線程池代碼解讀」,後來以爲單純的代碼解讀,極可能沒法理解其設計的精髓。思來想去,以爲仍是叫「實現一個線程池」比較合適。爲何呢?數據庫
不少人可能會有疑惑,既然Java已經提供了優秀的線程池,爲何咱們還要考慮去實現一個線程池呢,不都說不要重複造輪子嘛。我想是這樣的,當一個想成爲優秀「匠人」的人,在面對一個設計精良的「輪子」時,總抑制不住好奇和衝動,想知道這「輪子」是怎麼形成來的。緩存
那既然式想了解「輪子」是怎麼造的,咱們直接看「圖紙」不就能夠了嘛,幹嗎還再畫一遍「圖紙」呢?性能
這裏面的差距是很大的,當咱們看「圖紙」的時候,總會有種錯覺,感受就應該這麼設計,而忽略了最重要的問題,爲何要這麼設計呢。若是咱們不是造輪子的人,咱們是不會深入理解的。而當咱們嘗試「重複」造輪子的時候,咱們會和優秀的「匠人」產生思想的碰撞,這種思想的碰撞,會產生深入的記憶和反思。線程
線程池自己是池化技術之一,和數據庫鏈接池同樣,使用線程池主要是出於如下的考慮設計
咱們看一個單線程的例子,一個線程的完整週期大體須要3個步驟生命週期
整個線程的執行時長T=T1+T2+T3 實際上,咱們能夠看到,除了T2以外,T1和T3是能夠經過線程池節省出來的。這也是線程池的一個很重要的目標,線程池託管線程的建立和銷燬,也就是說,線程池是線程生命週期的管理者,這一點很是重要。隊列