ExecutorService和CompletionService区别

Posted 刘大飞

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ExecutorService和CompletionService区别相关的知识,希望对你有一定的参考价值。

ExecutorService和CompletionService区别:
ExecutorService:一直习惯自己维护一个list保存submit的callable task所返回的Future对象。在主线程中遍历这个list并调用Future的get()方法取到Task的返回值。


CompletionService:在很多地方会看到一些代码通过CompletionService包装ExecutorService,然后调用其take()方法去取Future对象。


这两者最主要的区别:   在于submit的task不一定是按照加入自己维护的list顺序完成的。从list中遍历的每个Future对象并不一定处于完成状态,这时调用get()方法就会被阻塞住,如果系统是设计成每个线程完成后就能根据其结果继续做后面的事,这样对于处于list后面的但是先完成的线程就会增加了额外的等待时间。
而CompletionService的实现是维护一个保存Future对象的BlockingQueue。只有当这个Future对象状态是结束的时候,才会加入到这个Queue中,take()方法其实就是Producer-Consumer中的Consumer。它会从Queue中取出Future对象,如果Queue是空的,就会阻塞在那里,直到有完成的Future对象加入到Queue中。
所以,先完成的必定先被取出。这样就减少了不必要的等待时间。
jdk 自带线程池结果管理器:ExecutorCompletionService。它将BlockingQueue 和Executor 封装起来。然后使用ExecutorCompletionService.submit()方法提交任务。

以上是关于ExecutorService和CompletionService区别的主要内容,如果未能解决你的问题,请参考以下文章

在 ExecutorService 的提交和 ExecutorService 的执行之间进行选择

ExecutorService.invokeAny()和ExecutorService.invokeAll()的使用剖析

Java 中这段代码中的 ExecutorService.submit 和 ExecutorService.execute 有啥区别?

ExecutorService的理解和使用

ExecutorService——shutdown方法和awaitTermination方法

ExecutorService和ThreadPoolExecutor运行原理