博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
scheduleWithFixedDelay和scheduleAtFixedRate源码分析
阅读量:7030 次
发布时间:2019-06-28

本文共 1428 字,大约阅读时间需要 4 分钟。

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://juejin.im/post/5bd2b4736fb9a05d212ede74

你可能感兴趣的文章
Android项目实战(三):实现第一次进入软件的引导页
查看>>
Web Service基础——基础概念
查看>>
Linux2.4文件系统中vfsmount、安装点的dentry、设备的dentry之间的关系【转】
查看>>
POJ 1201 Intervals
查看>>
JAVA訪问URL
查看>>
APP接口基础学习一
查看>>
设计模式 策略模式 以角色游戏为背景
查看>>
【转】CSS和SVG中的剪切——clip-path属性和<clipPath>元素
查看>>
【C语言入门教程】5.4 递归
查看>>
UVALive 6915 Leveling Ground 倍增RMQ
查看>>
Inside ARC — to see the code inserted by the compiler
查看>>
云中气象 有备而来
查看>>
4.dubbo-demo+简易监控中心安装+管理控制台安装
查看>>
读书笔记《集体智慧编程》Chapter 4 : Searching and Ranking
查看>>
jquery form 插件 分类: JavaScript ...
查看>>
php二维数组访问
查看>>
用Shell实现俄罗斯方块代码(Tetris.sh)
查看>>
[zz]Ubuntu Hadoop HDFS 配置
查看>>
上市后Avaya锣鼓全开,加速战略布局规划
查看>>
日调度5万亿次,腾讯云发布企业级微服务中间件TSF
查看>>