ThreadPoolExecutor源碼深入淺出之二

ThreadPoolExecutor源碼深入淺出之二

線程池執行函數execute的核心分析:

ThreadPoolExecutor源碼深入淺出之二

/** 線程池的三步處理1. 如果運行的線程小於corePoolSize,則創建一個Runnalbe對象的線程, 調用addWorker函數會原子性的檢查runState和workCount,通過返回false來防止線程錯誤創建

2. 如果一個任務能夠成功入隊列,在添加線程時仍需要進行雙次檢查,這樣做的目的是為了避免已經添加的線程在之前的檢測之後已經死了,或者當進入到此方法時,線程池已經關閉了,所以需要兩次檢查狀態。

3.如果任務無法添加到隊列中,那麼就是需要創建線程,如果創建失敗,說明線程池已經飽和或者線程池已經掛了,只能拒絕任務

*/

主要流程思路: 當工作線程數小於核心線程數,添加線程;線程池處於工作狀態,向隊列中添加任務;二次檢驗線程池狀態,如果線程池關閉了,將任務從隊列移除,執行拒絕策略;線程池處於工作狀態,向隊列中添加任務;二次檢驗線程池狀態,如果線程池關閉了,將任務從隊列移除,執行拒絕策略;工作線程添加失敗,拒絕策略

那麼接下來,我們看下線程池是如何添加工作線程的:

addWorker函數源碼思想:

就是往線程池中的HashSet<worker> workers 變量中添加worker,同時對於已經完成的worker又去掉worker。/<worker>

對具體的代碼分析:

ThreadPoolExecutor源碼深入淺出之二

首先,判斷當前線程的狀態是否符合條件,檢查線程池的狀態是否關閉,隊列是否為空;wc是工作線程數量,之後通過參數core來取值核心線程數和最大線程數,如果工作線程數大於核心線程數或者最大線程數,直接return,否則線程數增加,這一步主要是用於做校驗

繼續看創建線程部分(addWorker )代碼後半部分實現:

ThreadPoolExecutor源碼深入淺出之二

創建線程部分最核心的也是理解的重點就是:new一個新的worker,添加進HashSet,然後啟動woker裡的Thread,如果添加失敗就會直接從HashSet中。mainLock這個鎖是一個共用可重入鎖,使用場景非常多,如果說要做性能上要有更大優化的話,這個公共的鎖是一個可以考慮的點


分享到:


相關文章: