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

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. 洛谷P2514||bzoj2426 [HAOI2010]工厂选址

    洛谷P2514 bzoj2426 其实是个简单的贪心,然而不适合在脑子不清醒的时候做...看不懂题意续了1个小时 很容易发现应该枚举新建哪个发电厂,对于这种方案就是取其中b吨煤运到原来发电厂,取剩下( ...

  2. 【aspnetcore】让aspnetcore支持less文件

    第一步:新建文件 CustomerFileExtensionContentTypeProvider namespace xxx { public class CustomerFileExtension ...

  3. AttributeError: module 'shutil' has no attribute 'copyfileobj'

    import shutil #1.copyfileobj(源文件,目标文件) 将文件内容复制到另一个文件 shutil.copyfileobj(open('config.log','r'),open( ...

  4. vue 引用其他组件

    1.在components 目录下新建Test.vue 文件 <template> <div class="test"> <h1>{{ msg ...

  5. Jquery测试纠错笔记

    一. 解析: 获取元素范围大小顺序依次为: $(#one).siblings("div")>$("#one~div")>$("#one + ...

  6. 集合框架比较两个对象是否相同(equals和hashCode方法)

    package com.dcz.hashset; import java.util.HashSet; import java.util.Set; /** * HashSet是接口最常用的实现类,顾名思 ...

  7. hdu6118 度度熊的交易计划

    思路: 将生产和运输费用视作产出,将销售获利视作投入,计算最小费用可行流(不一定是最大流).注意片区之间的高速公路是双向边. 实现: #include <iostream> #includ ...

  8. sizeof()用法汇总 zhuan

    sizeof()功能:计算数据空间的字节数1.与strlen()比较      strlen()计算字符数组的字符数,以"\0"为结束判断,不计算为'\0'的数组元素.       ...

  9. XML文件的解析和序列化

    序列化: private void createXml() { XmlSerializer serializer = Xml.newSerializer();// xml文件生成器 File file ...

  10. apache安装报错

    libtool: install: error: cannot install `libaprutil-1.la' to a directory not ending /some_directory ...