ScheduledThreadPoolExecutor详解与总结
ScheduledThreadPoolExecutor详解简介
- 继承自ThreadPooExecutor,为任务提供延迟或周期执行.
- 使用专门的ScheduledFutureTask来执行周期任务,也可以接收不需要时间调度的任务.
- 使用DelayedWorkQueue存储任务.(一种无界延迟队列)
- 支持线程池关闭后可执行,可选择线程池关闭后支持继续执行周期或延迟任务.
public class ScheduledThreadPoolExecutor extends ThreadPoolExecutor implements ScheduledExecutorService {}
在源码中可以看到,ScheduledThreadPoolExecutor 的状态管理、入队操作、拒绝操作等都是继承于 ThreadPoolExecutor
;ScheduledThreadPoolExecutor 主要是提供了周期任务和延迟任务相关的操作;
schedule(Runnable command, long delay, TimeUnit unit) // 无返回值的延迟任务 schedule(Callable callable, long delay, TimeUnit unit) // 有返回值的延迟任务 scheduleAtFixedRate(Runnable command, long initialDelay, long period, TimeUnit unit) // 固定频率周期任务 scheduleWithFixedDelay(Runnable command, long initialDelay, long delay, TimeUnit unit) // 固定延迟周期任务
就ScheduledThreadPoolExecutor
的运行逻辑而言,大致可以表述为:
首先将 Runnable/Callable 封装为 ScheduledFutureTask,延迟时间作为比较属性;
然后加入DelayedWorkQueue 队列中,每次取出队首延迟最小的任务,超时等待,然后执行;
最后判断是否为周期任务,然后重新加入DelayedWorkQueue 队列中;
其内部结构如图所示:
这里需要注意的:
ScheduledThreadPoolExecutor 中的队列不能指定,只能是 DelayedWorkQueue;因为他是 无界队列,所以再添加任务的时候线程最多可以增加到 coreSize,这里不清楚的可以查看 ThreadPoolExecutor 详解,就不再重复了;
ScheduledThreadPoolExecutor 重写了 ThreadPoolExecutor 的execute() 方法,其执行的核心方法变成 delayedExecute();
参考博客:
https://blog.csdn.net/cristianoxm/article/details/107640772
https://www.jianshu.com/p/7018d21e4979
https://blog.csdn.net/weixin_43942106/article/details/112261645
郭慕荣博客园