1 緣起
怎麼想起來看執行緒池的程式碼?
很簡單,因為我不會用。
原先遇到用執行緒池一直是 Executors
直接構造一個出來。啊,newFixedThreadPool
就是建立定容執行緒池,執行緒數是固定的;newSingleThreadExecutor
就是建立一個單執行緒的任務佇列,一個一個執行,好簡單啊,執行緒池不過如此。
然而有一天我讀了《阿里巴巴 Java 開發手冊》,手冊第一章第六條第四點明確指出:
【強制】執行緒池不允許使用
Executors
去建立,而是通過ThreadPoolExecutor
的方式,這樣的處理方式讓寫的同學更加明確執行緒池的執行規則,規避資源耗盡的風險。
說明:Executors
返回的執行緒池物件的弊端如下:
1)FixedThreadPool
和SingleThreadPool
:允許的請求佇列長度為Integer.MAX_VALUE
,可能會堆積大量的請求,從而導致 OOM。
2)CachedThreadPool
和ScheduledThreadPool
:允許的建立執行緒數量為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
是一個兩千行的大類,沒關係我們一點一點去啃它。但內容實在太多,所以我覺得用系列文章的形式來記錄我學習程式碼的過程比較好:
- 介紹為什麼,以及打算怎麼做
- 閱讀類初始化及構造器程式碼,弄清楚我們 new 了一個什麼東西
- 當我們提交一個任務時,發生了什麼
- 如何控制執行緒池的行為
- 如何擴充套件執行緒池以實現我們自定的特性
閱讀程式碼時,小豹子的經驗是:一定要觀察動態的程式碼!要邊除錯邊看程式碼,觀察變數執行時的狀態。希望你能陪著小豹子一起,一步一步除錯,檢視自己機器上程式碼的執行狀態,主動思考,我們會成長更多。
系列文章
小豹子還是一個大三的學生,小豹子希望你能“批判性的”閱讀本文,對本文內容中不正確、不妥當之處進行嚴厲的批評,小豹子感激不盡。