線程池總結(jié)

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)部提交



  • 整體運行圖


?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容