写完了发现这么少。。。
从 ScheduledThreadPoolExecutor
这个名字就可以看出,这货 extends 了 ThreadPoolExecutor
。而大家都知道,在 ThreadPoolExecutor
的构造方法里有一个比较重要的参数是 BlockingQueue
。ScheduledThreadPoolExecutor
的特殊之处便在于它有一个 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
的工作原理了。