很簡單,由於我不會用。
原先遇到用線程池一直是 Executors
直接構造一個出來。啊,newFixedThreadPool
就是建立定容線程池,線程數是固定的;newSingleThreadExecutor
就是建立一個單線程的任務隊列,一個一個執行,好簡單啊,線程池不過如此。
然而有一天我讀了《阿里巴巴 Java 開發手冊》,手冊第一章第六條第四點明確指出:java
【強制】線程池不容許使用
Executors
去建立,而是經過ThreadPoolExecutor
的方式,這樣的處理方式讓寫的同窗更加明確線程池的運行規則,規避資源耗盡的風險。
說明:Executors
返回的線程池對象的弊端以下:
1)FixedThreadPool
和SingleThreadPool
:容許的請求隊列長度爲Integer.MAX_VALUE
,可能會堆積大量的請求,從而致使 OOM。
2)CachedThreadPool
和ScheduledThreadPool
:容許的建立線程數量爲Integer.MAX_VALUE
,可能會建立大量的線程,從而致使 OOM。post
而當我想嘗試手動實例化 ThreadPoolExecutor
時:學習
public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue, ThreadFactory threadFactory, RejectedExecutionHandler handler) 複製代碼
複雜的構造器令我望而卻步,當我「X度」Java 線程池
時,呈現給個人大多都是 Executors
的用法以及關於線程池的基本介紹,能把 ThreadPoolExecutor
講清楚的沒有幾個(也或許是小豹子笨,看不太懂),所以我以爲,去看官方文檔,去看代碼才能最直觀的去理解其中的原理!spa
小豹子想說:各位初學的小萌新,必定養成看官方文檔的習慣(最好直接看英文的,官方文檔即使是中文,翻譯每每也滯後,我就被舊版本的
Spring
中文官方文檔坑過)。官方文檔是最瞭解該程序的人寫的最正確的文檔,這裏邊有什麼坑,有什麼騷操做,官方文檔都會一一告訴你。
而「X度」的各類博客,咱們很難保證其正確性,不要迷信它們,要「批判性」的欣賞,畢竟寫博客是沒有門檻的(就連我一個豹子都能寫 ʅ(´◔౪◔)ʃ )。寫的好的博客每每是記錄解決一個問題的歷程,或者對於某功能實現本身的創新等等,咱們能夠從中窺見博主的思想與思路。而羅列知識點類的、粗而廣介紹類的、沒有博主本身的思想蘊含在其中的博客,恕小豹子直言,不如去看官方文檔。線程
ThreadPoolExecutor
是一個兩千行的大類,不要緊咱們一點一點去啃它。但內容實在太多,因此我以爲用系列文章的形式來記錄我學習代碼的過程比較好:翻譯
閱讀代碼時,小豹子的經驗是:必定要觀察動態的代碼!要邊調試邊看代碼,觀察變量運行時的狀態。但願你能陪着小豹子一塊兒,一步一步調試,查看本身機器上代碼的運行狀態,主動思考,咱們會成長更多。調試
小豹子仍是一個大三的學生,小豹子但願你能「批判性的」閱讀本文,對本文內容中不正確、不穩當之處進行嚴厲的批評,小豹子感激涕零。code