小豹子帶你看原始碼:Java 執行緒池(一)緣起 & 計劃

LeopPro發表於2018-01-28

1 緣起

怎麼想起來看執行緒池的程式碼?

很簡單,因為我不會用。
原先遇到用執行緒池一直是 Executors 直接構造一個出來。啊,newFixedThreadPool 就是建立定容執行緒池,執行緒數是固定的;newSingleThreadExecutor 就是建立一個單執行緒的任務佇列,一個一個執行,好簡單啊,執行緒池不過如此。
然而有一天我讀了《阿里巴巴 Java 開發手冊》,手冊第一章第六條第四點明確指出:

【強制】執行緒池不允許使用 Executors 去建立,而是通過 ThreadPoolExecutor 的方式,這樣的處理方式讓寫的同學更加明確執行緒池的執行規則,規避資源耗盡的風險。
說明:Executors 返回的執行緒池物件的弊端如下:
1)FixedThreadPoolSingleThreadPool:允許的請求佇列長度為 Integer.MAX_VALUE,可能會堆積大量的請求,從而導致 OOM。
2)CachedThreadPoolScheduledThreadPool:允許的建立執行緒數量為 Integer.MAX_VALUE,可能會建立大量的執行緒,從而導致 OOM。

而當我想嘗試手動例項化 ThreadPoolExecutor 時:

public ThreadPoolExecutor(int corePoolSize,
                              int maximumPoolSize,
                              long keepAliveTime,
                              TimeUnit unit,
                              BlockingQueue<Runnable> workQueue,
                              ThreadFactory threadFactory,
                              RejectedExecutionHandler handler) 
複製程式碼

複雜的構造器令我望而卻步,當我“X度”Java 執行緒池時,呈現給我的大多都是 Executors 的用法以及關於執行緒池的基本介紹,能把 ThreadPoolExecutor 講清楚的沒有幾個(也或許是小豹子笨,看不太懂),因此我覺得,去看官方文件,去看程式碼才能最直觀的去理解其中的原理!

小豹子想說:各位初學的小萌新,一定養成看官方文件的習慣(最好直接看英文的,官方文件即便是中文,翻譯往往也滯後,我就被舊版本的 Spring 中文官方文件坑過)。官方文件是最瞭解該程式的人寫的最正確的文件,這裡邊有什麼坑,有什麼騷操作,官方文件都會一一告訴你。
而“X度”的各種部落格,我們很難保證其正確性,不要迷信它們,要“批判性”的欣賞,畢竟寫部落格是沒有門檻的(就連我一個豹子都能寫 ʅ(´◔౪◔)ʃ )。寫的好的部落格往往是記錄解決一個問題的歷程,或者對於某功能實現自己的創新等等,我們可以從中窺見博主的思想與思路。而羅列知識點類的、粗而廣介紹類的、沒有博主自己的思想蘊含在其中的部落格,恕小豹子直言,不如去看官方文件。

2 計劃

ThreadPoolExecutor 是一個兩千行的大類,沒關係我們一點一點去啃它。但內容實在太多,所以我覺得用系列文章的形式來記錄我學習程式碼的過程比較好:

  1. 介紹為什麼,以及打算怎麼做
  2. 閱讀類初始化及構造器程式碼,弄清楚我們 new 了一個什麼東西
  3. 當我們提交一個任務時,發生了什麼
  4. 如何控制執行緒池的行為
  5. 如何擴充套件執行緒池以實現我們自定的特性

閱讀程式碼時,小豹子的經驗是:一定要觀察動態的程式碼!要邊除錯邊看程式碼,觀察變數執行時的狀態。希望你能陪著小豹子一起,一步一步除錯,檢視自己機器上程式碼的執行狀態,主動思考,我們會成長更多。

系列文章

小豹子還是一個大三的學生,小豹子希望你能“批判性的”閱讀本文,對本文內容中不正確、不妥當之處進行嚴厲的批評,小豹子感激不盡。

相關文章