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