scheduleWithFixedDelay和scheduleAtFixedRate原始碼分析

曉小麥發表於2018-10-26

scheduleWithFixedDelay和scheduleAtFixedRate的執行流程都是一樣的,如下

ScheduledThreadPoolExecutor.scheduleWithFixedDelay
    ->ScheduledThreadPoolExecutor.delayedExecute
        ->ThreadPoolExcutor.ensurePrestart
        ->ThreadPoolExcutor.addWorker         建立的work數等於Executors.newScheduledThreadPool中的引數corePoolSize
            ->Worker.thread.run 
複製程式碼

開始下面的Work中執行緒的run邏輯 Worker中的run方法才是執行的核心部分,run方法會呼叫ThreadPoolExecutor中的runWorker方法,執行過程如下

ThreadPoolExecutor.runWorker
    ->Worker.getTask             第一大塊:死迴圈從queue裡獲取馬上要執行的任務,如果獲取不到任務,跳出迴圈
        ->DelayedWorkQueue.take
            ->ConditionObject.awaitNanos          任務暫停的間隔時間全靠這裡
            ->DelayedWorkQueue.finishPoll
                ->DelayedWorkQueue.siftDown         DelayedWorkQueue是一個二叉樹結構,每次彈出這個二叉樹中最小的值,然後重新調整二叉樹結構,如何對比大小參考ScheduledFutureTask.compareTo方法

    ->ScheduledFutureTask.run    第二大塊:執行任務,生成新任務
        ->FutureTask.runAndReset
            ->Callable.call           執行使用者的任務
        ->ScheduledFutureTask.setNextRunTime    設定任務的下次執行時間
        ->ScheduledThreadPoolExecutor.reExecutePeriodic
            ->DelayedWorkQueue.add   生成新任務放入queue裡
                ->DelayedWorkQueue.offer
                    ->DelayedWorkQueue.siftUp     DelayedWorkQueue是一個二叉樹結構,最小值在上面,每次向二叉樹中插入值時重新調整二叉樹結構,如何對比大小參考ScheduledFutureTask.compareTo方法
            ->ThreadPoolExcutor.ensurePrestart   確保work數量等於corePoolSize,並啟動work
複製程式碼

下面是簡單的圖示部分,更能幫助理解

scheduleWithFixedDelay和scheduleAtFixedRate原始碼分析

相關文章