Java 并发之 ScheduledThreadPoolExecutor 原理分析

本文深入探讨ScheduledThreadPoolExecutor的实现原理,特别是其内部的DelayedWorkQueue如何通过二叉堆算法进行延迟任务排序,并介绍如何处理重复任务。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


写完了发现这么少。。。

从 ScheduledThreadPoolExecutor 这个名字就可以看出,这货 extends 了 ThreadPoolExecutor。而大家都知道,在 ThreadPoolExecutor 的构造方法里有一个比较重要的参数是 BlockingQueueScheduledThreadPoolExecutor 的特殊之处便在于它有一个 BlockingQueue 的内部实现类 DelayedWorkQueue

DelayedWorkQueue

这个 DelayedWorkQueue 和另一个 BlockingQueue 的实现 DelayQueue 很像。都是通过二叉堆算法实现排序,同样是在取操作的时候会 block 住知道 delay 到期。不同的是 DelayedWorkQueue 并没有采用 PriorityQueue,而是自己实现的二叉堆算法,不知道这是为什么(我猜是因为同是 1.5 新类,所以没有重用)。

根据二叉堆的定义,DelayedWorkQueue 中的元素第一个元素永远是 delay 时间最小的那个元素,如果 delay 没有到期,take 的时候便会 block 住。

了解了 DelayedWorkQueue,理解 ScheduledThreadPoolExecutor 就容易了。当执行 schedule 方法是。如果不是重复的任务,那任务从 DelayedWorkQueue 取出之后执行完了就结束了。如果是重复的任务,那在执行结束前会重置执行时间并将自己重新加入到 DelayedWorkQueue 中。这在第 295 行有体现:


public void run() {
    boolean periodic = isPeriodic();
    if (!canRunInCurrentRunState(periodic))
        cancel(false);
    else if (!periodic)
        ScheduledFutureTask.super.run();
    else if (ScheduledFutureTask.super.runAndReset()) {
        setNextRunTime();
        reExecutePeriodic(outerTask); // 把自己重新加入到队列中
    }
}

总结

其实只要你理解了 DelayedWorkQueue 便能很容易理解 ScheduledThreadPoolExecutor 的工作原理了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值