Java 并发之 ScheduledThreadPoolExecutor 原理分析


写完了发现这么少。。。

从 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 的工作原理了。

猜你喜欢

转载自blog.csdn.net/gongjdde/article/details/78623072