1.概覽


功能簡介:
- ThreadPoolExecutor就是普通的線程池。
- ScheduledThreadPoolExecutor特別適用于延遲執(zhí)行任務(wù):以固定間隔調(diào)度任務(wù)或者以固定延遲調(diào)度任務(wù)
- ForkJoinPool適用于使用分治法(Divide-and-Conquer Algorithm)能夠解決的問題,特點是工作密取。
2.線程池ThreadPoolExecutor的架構(gòu)
2.1 線程池四大構(gòu)件
- 首先就是線程池本身:ctl狀態(tài)管理、執(zhí)行任務(wù)execute及submit、線程增加和縮減、以及shutdown和shutdownNow操作
- 線程本身Worker,本身實現(xiàn)了AQS,在執(zhí)行任務(wù)加鎖,屏蔽了中斷
- 阻塞隊列,從隊列中取任務(wù)getTask
- 任務(wù)FutureTask
2.2 任務(wù)兩級調(diào)度模型

2.3 Executor框架的三大部分
- 1.任務(wù)——Runnable Callable
- 2.任務(wù)的執(zhí)行——ThreadPoolExecutor、ScheduledThreadPoolExecutor
-
3.異步計算的結(jié)果——Future(FutureTask)
3.ScheduledThreadPoolExecutor
3.1 Leader-Follower模式
參考并發(fā)容器BlockingQueue - DelayQueue及Leader-Follower模式
leader是等待隊列頭部元素的指定線程。Leader-Follower模式的這種變體用于最小化不必要的定時等待。
- 當一個線程稱為leader時,其會定時等待下一個delay元素過期,但是其他線程會無限期等待。
- 當從take/poll返回之前,leader線程必須signal其他等待線程,除非在此期間有線程稱為了新的leader。
- 每當隊列頭部元素被更早到期的元素替換時,leader被置為null,offer里面q.peek() == e時,會將leader=null,此時當然會signal,重新競選leader。所以定時等待線程必須要處理失去leader時情況。
3.2 ScheduledThreadPoolExecutor四大構(gòu)件
- 首先就是線程池本身:執(zhí)行任務(wù)execute及submit被覆蓋了以實現(xiàn)周期任務(wù),增加了run-after-shutdown參數(shù)來處理線程池關(guān)閉后怎么處理周期任務(wù)
- 線程還是沿用Worker,本身實現(xiàn)了AQS,在執(zhí)行任務(wù)加鎖,屏蔽了中斷
- 阻塞隊列使用的是定制的DelayedWorkQueue,優(yōu)先隊列,ScheduledFutureTask會記錄其在堆數(shù)組中索引,這會消除在取消時查找任務(wù)的操作,大大加快了移除操作。但是在siftUp和siftDown中會增加維護索引的額外操作。
- 任務(wù)是繼承自FutureTask的ScheduledFutureTask,實現(xiàn)了compareTo(基于time和序列號),方便放入DelayedWorkQueue。通過period區(qū)分是一次性任務(wù)還是周期性任務(wù)。通過setNextRuntime區(qū)分是scheduleAtFixedRate還是scheduleWithFixedDelay。
4.ForkJoinPool
4.1 四大構(gòu)件
線程池ForkJoinPool,核心的ctl打包了AC、TC、SS和ID,runState用于操作workQueues數(shù)組。
工作線程ForkJoinWorkerThread,每個工作線程都會注冊一個自己的WorkQueue,該WorkQueue放在workQueues數(shù)組奇數(shù)索引處。線程執(zhí)行時,不一定會執(zhí)行當前 WorkQueue 中的任務(wù),而是可以偷取別的Worker的任務(wù)來執(zhí)行。
-
隊列WorkQueue,支持工作竊取和外部任務(wù)提交的雙端隊列,只支持四種可能的端操作中的三種 - push,pop和poll(也稱為steal),進一步的限制是push和pop僅從擁有的線程調(diào)用,而poll可以從其他線程調(diào)用。
任務(wù)ForkJoinTask。
1)任務(wù)類型
RecursiveAction——不返回結(jié)果的計算
RecursiveTask——返回結(jié)果
CountedCompleter——已完成的操作觸發(fā)其他操作
2)內(nèi)部提交
fork——直接加入到當前線程的workQueue中
invoke——提交任務(wù)等待任務(wù)完成并獲取結(jié)果(當前線程執(zhí)行)
join——等待任務(wù)完成并獲取結(jié)果,嘗試在當前線程中開始執(zhí)行。
3)任務(wù)狀態(tài)
當狀態(tài)完成時,為負數(shù),表示正常完成、取消或者異常;
阻塞等待的任務(wù)設(shè)置了SIGNAL
4.2 整體的運行機理
-
ForkJoinPool適合分治算法
-
任務(wù)提交分為外部和內(nèi)部提交
-
整體運行圖





