scheduleWithFixedDelay和scheduleAtFixedRate源码分析

1,078 阅读1分钟

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

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