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
複製程式碼
下面是簡單的圖示部分,更能幫助理解