CompletionService是Java8的新增接口,JDK為其提供了一個實現(xiàn)類ExecutorCompletionService。這個類是為線程池中Task的執(zhí)行結(jié)果服務的,即為Executor中Task返回Future而服務的。CompletionService的實現(xiàn)目標是任務先完成可優(yōu)先獲取到,即結(jié)果按照完成先后順序排序。
public class ExecutorCompletionService<V> implements CompletionService<V> {
private final Executor executor;
private final AbstractExecutorService aes;
private final BlockingQueue<Future<V>> completionQueue;
...
}
可以看到ExecutorCompletionService主要是增強executor線程池的。Task包裝后被塞入completionQueue,當Task結(jié)束,其Future就可以從completionQueue中獲取到。也就是說,任務完后也會有一個隊列收集起來,F(xiàn)uture按照先執(zhí)行完的任務從隊列中獲取

image.png
CompletionService接口源碼:
public interface CompletionService<V> {
// 提交
Future<V> submit(Callable<V> task);
Future<V> submit(Runnable task, V result);
// 獲取
Future<V> take() throws InterruptedException;
Future<V> poll();
Future<V> poll(long timeout, TimeUnit unit) throws InterruptedException;
}