写完了发现这么少。。。
ScheduledThreadPoolExecutor
这个名字就可以看出,这货 extends 了 ThreadPoolExecutor
。而大家都知道,在 ThreadPoolExecutor
的构造方法里有一个比较重要的参数是 BlockingQueue
。ScheduledThreadPoolExecutor
的特殊之处便在于它有一个 BlockingQueue
的内部实现类 DelayedWorkQueue
。
DelayedWorkQueue
DelayedWorkQueue
和另一个 BlockingQueue
的实现 DelayQueue
很像。都是通过二叉堆算法实现排序,同样是在取操作的时候会 block 住知道 delay 到期。不同的是 DelayedWorkQueue
并没有采用 PriorityQueue
,而是自己实现的二叉堆算法,不知道这是为什么(我猜是因为同是 1.5 新类,所以没有重用)。DelayedWorkQueue
DelayedWorkQueue
,理解 ScheduledThreadPoolExecutor
就容易了。当执行 schedule 方法是。如果不是重复的任务,那任务从 DelayedWorkQueue
取出之后执行完了就结束了。如果是重复的任务,那在执行结束前会重置执行时间并将自己重新加入到 DelayedWorkQueue
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); // 把自己重新加入到队列中
}
}
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