scheduleWithFixedDelay和scheduleAtFixedRate源码分析

先放张图,有兴趣的话我再加细节说明。

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

下面是简单的图示部分,更能帮助理解

 

posted @ 2018-10-18 20:16  oldbaili  阅读(265)  评论(0编辑  收藏  举报