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

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

 

转载于:https://www.cnblogs.com/oldbai/p/9812890.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值