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

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源码分析的更多相关文章

  1. ScheduleThreadPoolExecutor源码分析

    ScheduleThreadPoolExecutor源码分析(一) Java中ScheduleThreadPoolExecutor主要用于执行延迟任务或者按照一定的频率执行任务.其中scheduleA ...

  2. Spring 3.1新特性之二:@Enable*注解的源码,spring源码分析之定时任务Scheduled注解

    分析SpringBoot的自动化配置原理的时候,可以观察下这些@Enable*注解的源码,可以发现所有的注解都有一个@Import注解.@Import注解是用来导入配置类的,这也就是说这些自动开启的实 ...

  3. java多线程——线程池源码分析(一)

    本文首发于cdream的个人博客,点击获得更好的阅读体验! 欢迎转载,转载请注明出处. 通常应用多线程技术时,我们并不会直接创建一个线程,因为系统启动一个新线程的成本是比较高的,涉及与操作系统的交互, ...

  4. 7.源码分析---SOFARPC是如何实现故障剔除的?

    我在服务端引用那篇文章里面分析到,服务端在引用的时候会去获取服务端可用的服务,并进行心跳,维护一个可用的集合. 所以我们从客户端初始化这部分说起. 服务连接的维护 客户端初始化的时候会调用cluste ...

  5. JUC源码分析-线程池篇(三)ScheduledThreadPoolExecutor

    JUC源码分析-线程池篇(三)ScheduledThreadPoolExecutor ScheduledThreadPoolExecutor 继承自 ThreadPoolExecutor.它主要用来在 ...

  6. ScheduledThreadPoolExecutor源码分析-你知道定时线程池是如何实现延迟执行和周期执行的吗?

    Java版本:8u261. 1 简介 ScheduledThreadPoolExecutor即定时线程池,是用来执行延迟任务或周期性任务的.相比于Timer的单线程,定时线程池在遇到任务抛出异常的时候 ...

  7. 线程池底层原理详解与源码分析(补充部分---ScheduledThreadPoolExecutor类分析)

    [1]前言 本篇幅是对 线程池底层原理详解与源码分析  的补充,默认你已经看完了上一篇对ThreadPoolExecutor类有了足够的了解. [2]ScheduledThreadPoolExecut ...

  8. rxjava源码分析

    RXjava响应式编程 此文作者大暴雨原创,转载请注明出处. 如果线程的知识不是很丰富,请先查看     rxjava源码中的线程知识  一文 rxjava总结就是:异步实现主要是通过扩展观察者模式 ...

  9. 【原】 Spark中Worker源码分析(二)

    继续前一篇的内容.前一篇内容为: Spark中Worker源码分析(一)http://www.cnblogs.com/yourarebest/p/5300202.html 4.receive方法, r ...

随机推荐

  1. 洛谷1072(gcd的运用)

    已知正整数a0,a1,b0,b1,设某未知正整数x满足: 1. x 和 a0 的最大公约数是 a1​: 2. x 和 b0​ 的最小公倍数是b1. Hankson 的“逆问题”就是求出满足条件的正整数 ...

  2. linux 设置固定IP centOS6.5

    主要是要把Linux的IP固定下来,可以用另一台机器SSH连接. ping的用法: 基本语法:ping [-选项] IP地址或域名 功能描述:测试网络是否连通 常用选项:-c -c 指定发送数据包的次 ...

  3. python入门之集合set

    集合(无序不重复) 创建 s = {} s = set() 转换 s = set(li) 方法 s.add("chy") #添加元素 s.clear() #清除元素 a = s.d ...

  4. 转 PHP 正则表达式 以及案例

    2.Perl兼容的语法扩充 Perl兼容的正则表达式的模式类似于Perl中的语法,表达式必须包含在定界符中,除数字.字母.反斜线外的任何字符都可以作为定界符.例如,表达式’/^(?i)php[34]/ ...

  5. spring security 5 There is no PasswordEncoder mapped for the id "null" 错误

    转载请注明出处 http://www.cnblogs.com/majianming/p/7923604.html 最近在学习spring security,但是在设置客户端密码时,一直出现了一下错误提 ...

  6. 定时任务-Timer

    Timer类的全限定名 java.util.Timer java.util.Timer类的构造函数 public Timer(); public Timer(boolean isDaemon); pu ...

  7. NOIP数学相关模板整理

    $O(n)$递推求逆元 #include<cstdio> #include<cstring> #include<algorithm> using namespace ...

  8. Objective-C Fast Enumeration

    Fast enumeration is an Objective-C's feature that helps in enumerating through a collection. So in o ...

  9. (转载)EventBus使用详解

    (转载)http://liuling123.com/2016/01/EventBus-explain.html 概述 EventBus是针一款对Android的发布/订阅事件总线.它可以让我们很轻松的 ...

  10. Android - CollapsingToolbarLayout 完全解析

    CollapsingToolbarLayout 是 google 在其推出的design libiary 中给出的一个新型控件.其可以实现的效果类似于: toolbar是透明的,有一个背景图片以及大标 ...