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()方法提交任务。

最新文章

  1. Ubuntu上安装Minecraft服务器
  2. 【转】Kafka实战-Flume到Kafka
  3. maven项目如何使用jetty启动?
  4. jquery.validate使用 - 2
  5. Android 中pid与uid的作用与区别
  6. simplexml_load_string 解析gb2312编码的xml
  7. flash builder Error #2032
  8. Android:自定义滚动边缘(EdgeEffect)效果
  9. 微信js-sdk调用
  10. Unity 脚本中各种[XXX]的用法
  11. Java多线程的几个常用关键字
  12. PHP开发工程师应该具备那些技术能力
  13. MapReduce框架原理-MapTask工作机制
  14. day 3 - 1 数据类型
  15. Java ,python面向对象的继承及其区别
  16. 小程序 青少儿书画 利用engineercms作为服务端
  17. 工资薪金VS劳务报酬
  18. CentOS 6.5环境使用ansible剧本自动化部署Corosync + pacemaker环境及corosync常用配置详解
  19. MVC中的Ajax与增删改查(二)
  20. 解决Java Web项目中Word、Excel等二进制文件编译后无法打开的问题

热门文章

  1. Centos 7.0设置静态IP
  2. golang手动管理内存
  3. Android-Android进程间通讯之messenger
  4. samba服务器的搭建和配置
  5. Python爬虫-- Scrapy框架
  6. 2017-2018-1 20179209《Linux内核原理与分析》第四周作业
  7. Java 中的四种引用类型(转)
  8. html乱码怎问题
  9. 用c++后缀自动机实现最大公共字符串算法,并封装成Python库
  10. API的理解和使用——字符串的命令