ExecutorCompletionService解耦异步任务的生产者和消费者;当有任务执行完毕时,可以通过take直接获取结果处理;
ExecutorCompletionService线程执行委托给Executor的实际实现,其使用BlockingQueue保存已完成任务队列,同时提供了QueueingFuture对提交任务进行装饰,并提交执行;
QueueingFuture的实现:
private class QueueingFuture extends FutureTask<Void> {
QueueingFuture(RunnableFuture<V> task) {
super(task, null);
this.task = task;
}
protected void done() { completionQueue.add(task); }
private final Future<V> task;
}
实现了done()扩展方法,保证任务执行完毕时,由run方法回调,并将结果放再completionQueue中
消费者获取任务执行结果时,通过调用take/poll方法获取completionQueue中已完成任务
public Future<V> take() throws InterruptedException {
return completionQueue.take();
}
public Future<V> poll() {
return completionQueue.poll();
}
public Future<V> poll(long timeout, TimeUnit unit) throws InterruptedException {
return completionQueue.poll(timeout, unit);
}