ExecutorCompletionService 的作用就是把线程池的执行结果放到一个已完成队列中,方便获取执行结果,其内部主要通过一个 FutureTask 的实现类 QueueingFuture 来实现这个功能:
private class QueueingFuture extends FutureTask {
QueueingFuture(RunnableFuture task) {
super(task, null);
this.task = task;
}
protected void done() { completionQueue.add(task); }
private final Future task;
}
其中 done 方法是 FutureTask 方法的重写。FutureTask 在完成时会执行 done 方法,把 task 放入已完成队列 completionQueue。