ScheduledThreadPoolExecutor机制原理

ScheduledThreadPoolExecutor:

介绍:是JUC包下周期性任务调度的工具类,之前这些工作需要Timer/TimerTask来完成,但Timer有着不少缺陷,如单线程模式,如果某个任务比较耗时时,会影响其它任务的调度;Timer如果某个任务执行时出现异常没有被catch导致唯一的线程死亡从而其它任务不再会被调度;
在这里插入图片描述
继承了常规的线程池ThreadPoolExecutor;
使用了自己的内部类DelayedWorkQueue阻塞队列,其类似于阻塞等待队列DelayQueue,前面已经介绍过了是一种使用PriorityBlockingQueue优先级队列实现的、基于时间调度的无界阻塞队列;
其传入的任务封装成ScheduledFutureTask,该类实现了Delayed接口,也就是具有了在队列基于调度时间排序的功能,也具有了基于时间调度任务的功能;

在这里插入图片描述
大致流程介绍:
1、ScheduledFutureTask因为实现Runnble接口,所以其具有run()方法;
2、因为其继承了ThreadPoolExecutor,所以其具有其一样的功能,前面已经详细介绍过ThreadPoolExecutor的原理,就是从阻塞队列中take()/poll(param)获取执行时间小于等于当前时间的任务,然后开始执行任务;
3、执行完成之后,再根据任务的调度周期重新设置这个任务的下次调度时间,并再加入阻塞队列中等待下一次的获取执行;
4、以此反复达到了周期性执行任务的效果(所以一个任务执行时间过长,大于设置的周期时间,这个任务执行完成之后,才能执行下一次的周期,并且是立马就执行,因为从新加入队列的任务的调度时间早就大于了当前时间,这是scheduleAtFixedRate()方法,而scheduleWithFixedDelay()方法是基于上个任务完成之后设置调度时间的。

三个重要的执行方法:
public ScheduledFuture<?> schedule(Runnable command,
long delay,
TimeUnit unit)
延迟执行;

public ScheduledFuture<?> scheduleAtFixedRate(Runnable command,
long initialDelay,
long period,
TimeUnit unit)
延迟并且周期执行;其设置任务的执行时间是基于上个任务执行时间加上执行周期设置的;

public ScheduledFuture<?> scheduleWithFixedDelay(Runnable command,
long initialDelay,
long delay,
TimeUnit unit)
延迟并且周期执行,其设置任务的执行时间是基于上个任务执行完成时的时间加上执行周期设置的;

看一下构造函数

public ScheduledThreadPoolExecutor(int corePoolSize) {
   
    super(corePoolSize, Integer.MAX_VALUE, 0, NANOSECONDS,
          new DelayedWorkQueue());
}
其只能设置核心线程数;

再来研究一下其阻塞队列的存储结构:
是基于优先级堆的数据结构,其逻辑结构是二叉树,其存储结构是数组,类似于PriorityBlockingQueue和DelayQueue;
队列中是按照执行时间来的降序排序的,执行时间距离当前时间越近的越排在队列的前面,;
堆的逻辑结构图如下:可见其基于最小堆结构的

在这里插入图片描述
其数组存储结构如下:
在这里插入图片描述
在这种结构中,可以发现有如下特性:
假设,索引值从0开始,子节点的索引值为k,父节点的索引值为p,则:
1.一个节点的左子节点的索引为:k = p * 2 + 1;
2.一个节点的右子节点的索引为:k = (p + 1) * 2;
3.一个节点的父节点的索引为:p = (k - 1) / 2。

每一次从队列中取出一个元素后,其需要重新排序,这里就不作详细的介绍了其排序方法是private void siftDown(int k, RunnableScheduledFuture<?> key),可以从DelayedWorkQueue的public RunnableScheduledFuture<?> take()方法进入;

下面正在进入其主要流程:
以:scheduleAtFixedRate方法为例:

public ScheduledFuture<?> scheduleAtFixedR
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值