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
下面是简单的图示部分,更能帮助理解