ScheduledThreadPoolExecutor源码解析

2017-02-14  本文已影响637人  miaoLoveCode

ScheduledThreadPoolExecutor主要用来定期执行任务,或者是在给定的延迟之后运行任务。它的功能与Timer类似,但是比起Timer,ScheduledThreadPoolExecutor功能更强大,使用也更灵活。

ScheduledThreadPoolExecutor与Timer区别:

ScheduledThreadPoolExecutor源码分析

在开始分析源码具体实现之前,先给一个简单的ScheduledThreadPoolExecutor使用案例:


ScheduledThreadPoolExecutor使用案例
  1. ScheduledThreadPoolExecutor声明;

  2. 调用scheduleAtFixedRate方法和scheduleWithFixedDelay方法提交定时任务task。

类声明

在看构造方法之前先来看看ScheduledThreadPoolExecutor类声明:


ScheduledThreadPoolExecutor类声明

从ScheduledThreadPoolExecutor类声明可以看出:

构造方法

ScheduledThreadPoolExecutor提供3个构造方法以供使用者使用:


构造方法

从构造方法可以看出,ScheduledThreadPoolExecutor使用DelayQueue来作为线程池的工作队列,由于DelayQueue是无界队列,根据线程池的工作原理,核心参数maximumPoolSize在ScheduledThreadPoolExecutor中是没有什么意义的。

总的来说,ScheduledThreadPoolExecutor为了实现周期性执行任务,对ThreadPoolExecutor做了以下改动:

任务提交与调度

ScheduledThreadPoolExecutor中最常用的任务提交的方法有两个:ScheduleAtFixedRate方法和ScheduleWithFixedDelay方法。


源码实现

具体的执行流程如下:

  1. 参数校验,不合法参数抛出异常;

  2. 构造task;

  3. 调用delayedExecute方法进行后续相关处理。

接下来我们先来分析ScheduledThreadPoolExecutor的调度任务的最小单位ScheduledFutureTask相关实现。

ScheduledFutureTask

看完task之后,我们接下看看看构造好task之后的delayedExecute方法相关实现。

** delayedExecute实现**


delayedExecute实现

delayedExecute方法主要完成了这些操作:

  1. 将task添加到工作队列;

  2. 调用ensurePrestart()方法做预处理,该方法实现在线程池一文中做过详细分析在这里就不再做赘述了。

任务调度小结

到这里为止,ScheduledThreadPoolExecutor的task执行过程可以总结为下图:


任务执行步骤

接下来我们来详细看看各个步骤DelayQueue具体相关实现。

任务获取 - take实现

take实现
具体执行步骤如下:
  1. 获取Lock;

  2. 从优先队列中获取任务:

  1. 释放Lock。

ScheduledThreadPoolExecutor的getTask()方法会无限循环获取task,直到线程从PriorityQueue中获取到一个元素后,才会退出无限循环。

任务添加 - add实现

add实现
add方法的核心是offer方法调用,我们来看看offer方法的具体实现:
offer实现
具体执行步骤如下:
  1. 获取Lock;

  2. 添加任务:

  1. 释放Lock。
上一篇 下一篇

猜你喜欢

热点阅读