Java多线程学习(十)CompletionService学习

CompletionService整合了Executor和BlockingQueue的功能。可以将多个Future任务添加到BlockingQueue的队列中,然后获取是可以调用take(阻塞)或poll(非阻塞)方法从队列中获取任务的执行结果。

添加到队列中的任务时按照执行完成时间的顺序添加进去的,先完成的任务先添加到队列中,所以从队列中获取任务结果也一定是先获取到最先计算完成的。

ExecutorCompletionService是CompletionService接口的实现类,它有三个成员变量:


1.executor:执行task的线程池,创建CompletionService必须指定;

2.aes:主要用于创建待执行task;

3.completionQueue:存储已完成状态的task,默认是基于链表结构的阻塞队列LinkedBlockingQueue。


引用:CompletionService的实现是维护一个保存Future对象的BlockingQueue。只有当这个Future对象状态是结束的时候,才会加入到这个Queue中,take()方法其实就是Producer-Consumer中的Consumer。它会从Queue中取出Future对象,如果Queue是空的,就会阻塞在那里,直到有完成的Future对象加入到Queue中。所以,先完成的必定先被取出。这样就减少了不必要的等待时间


扫描二维码关注公众号,回复: 2245066 查看本文章

猜你喜欢

转载自blog.csdn.net/wanderlustlee/article/details/80819042