举个例子,现在需要执行10个任务,这些任务都是有返回值,并且需要使用10个线程同时执行。一般的做法就是创建ExecutorService线程池,pool大小10,每个任务实现Callable接口,然后执行使用List保存每个线程的Future结果,然后遍历这个List,取出future,然后使用.get()获取执行的结果。

(1)
ExecutorService**的处理就是使用list存

//伪代码
ExecutorService executor = Executors.newFixedThreadPool(10);
List<Future<Object>> futureList = new ArrayList<Future<String>>();
for(int i = 0 ; i<10; i++){
Future<Object> future = executor.submit( 任务i );
futureList.add(future);
} 遍历futureList获取future调用.get()获取结果

但是会发现一个问题,假设任务标号1-10一次执行,所以放入list中的future也是标号1-10,在遍历list的过程中,如果任务4完成了,任务2还没有完成,那么就会一直阻塞在任务2的future.get()中,其实后面的任务可能已经做完了,但是还是要等前面的任务得到结果。

(2)CompletionService的处理

         ExecutorService executor = Executors.newFixedThreadPool(numThread);
CompletionService<String> completionService = new ExecutorCompletionService<String>(executor);
for(int i = 0;i<numThread;i++ ){
completionService.submit任务 i );
}
for(int i = 0;i<numThread;i++ ){
completionService.take().get();
}

CompletionService的效果则是,哪个任务先完成则取出哪个任务的结果,其实现原理是使用BlockingQueue来保存future,只有当future对应的某个任务执行结束,可以获取结果后,才会把这个future放入到BlockingQueue中,completionService.take()操作则是取出BlockingQueue的future,如果BlockingQueue中还没有结果,则take()方法阻塞,等待有结果,一旦有结果放入则取出。CompletionService快,可以节省时间,但是不能保证结果处理顺序。

java concurrent 中ExecutorService和CompletionService简单区别的更多相关文章

  1. java集合中List与set的区别

       java集合中List与set的区别.     List可以存储元素为有序性并且元素可以相同.     set存储元素为无序性并且元素不可以相同.     下面贴几段代码感受一下: ArrayL ...

  2. java线程中的sleep和wait区别

                                                                            面试题:java线程中sleep和wait的区别以及其资 ...

  3. 浅谈JAVA GUI中,AWT与Swing的区别、联系及优缺点

    浅谈JAVA GUI中,AWT与Swing的区别.联系及优缺点 A.区别 1.发布的时间 AWT是在JDK 1.0版本时提出的 Swing是在AWT之后提出的(JAVA 2) 2. ”重量” AWT是 ...

  4. java项目中ehcache缓存最简单用法

      java项目中ehcache缓存最简单用法: 1.下载ehcache-core-2.4.3.jar复制到项目的lib目录下 2.新建ehcache.xml文件,放置在项目src目录下的resour ...

  5. java并发中ExecutorService的使用

    文章目录 创建ExecutorService 为ExecutorService分配Tasks 关闭ExecutorService Future ScheduledExecutorService Exe ...

  6. Java NIO中核心组成和IO区别

    1.Java NIO核心组件 Java NIO中有很多类和组件,包括Channel,Buffer 和 Selector 构成了核心的API.其它组件如Pipe和FileLock是与三个核心组件共同使用 ...

  7. Java泛型中extends和super的区别?

    <? extends T>和<? super T>是Java泛型中的"通配符(Wildcards)"和"边界(Bounds)"的概念. ...

  8. java多线程中 volatile与synchronized的区别-阿里面试

    volatile 与 synchronized 的比较(阿里面试官问的问题) ①volatile轻量级,只能修饰变量.synchronized重量级,还可修饰方法 ②volatile只能保证数据的可见 ...

  9. java泛型中extends 和 super的区别

    一般对泛型中extends 和 super 的区别是这样介绍的: 关键字说明 ? 通配符类型 <? extends T> 表示类型的上界,表示参数化类型的可能是T 或是 T的子类 < ...

随机推荐

  1. 一、Unity Editor自定义菜单

    官方文档:https://unity3d.com/cn/learn/tutorials/topics/interface-essentials/unity-editor-extensions-menu ...

  2. pyinstaller将python编写的打卡程序打包成exe

    编写了一个简易的定时提醒下班打卡程序,python代码如下: #coding:utf-8 import time import datetime from tkMessageBox import * ...

  3. React Native 'config.h' file not found 问题、 'glog/logging.h' file not found 问题、configure: error: C compiler cannot create executables问题解决过程记录

    1.在github 上面 git clone 一个RN 项目代码,npm install (yarn)后,准备运行iOS工程,发现'config.h' file not found ,恶心!!! 百度 ...

  4. 12.23daily_scrum

    今天大家的工作重心在调试过程中,以便及时地发现和解决在调试过程中出现的问题和漏洞,悬浮窗测试工作也已经展开,主要集中在边缘设计代码的测试部分,具体工作如下: 具体工作: 小组成员 今日任务 明日任务 ...

  5. Beta版本总结

    beta 阶段的 postmortem 报告 1. 每个成员在beta 阶段的实践和alpha 阶段有何改进? 成员  Beta阶段的实践和alpha 阶段有何改进  黄山成 beta阶段较alpha ...

  6. VS2015安装与单元测试

    很久之前就听说微软有一款强大的编程软件——Visual Stdio系列,也许是满足于VC和CB的小巧一直都没有去尝试,借这次软件工程的机会终于可以一睹其真容,第一感觉是高大上,一改VC和CB的简洁,看 ...

  7. Alpha冲刺——测试随笔

    写在前面 作业链接 测试工作安排 测试模块 用户登录 日常管理模块 项目展示模块 测试计划 用户登录 测试功能 测试项 输入/操作 检验点 预期效果 用户登录 登录动作 点击登录 报错提示 无法登录, ...

  8. beta圆桌2!

    031602111 傅海涛 1.今天进展 文档转换差不多完成 2.存在问题 无 3.明天安排 增加新功能和完善之前的功能 4.心得体会 接口真难 031602115 黄家雄 1.今天进展 考了六级 2 ...

  9. C语言入门:03.关键字、标识符、注释

    一.学习语法之前的提醒 (1)C语言属于一门高级语言,其实,所有高级语言的基本语法组成部分都是一样的,只是表现形式不太一样 (2)就好像亚洲人和非洲人,大家都有人类的结构:2只 手.2只脚.1个头,只 ...

  10. 淘宝卖家搜索器V1.6算法注册机。

    该软件的算法非常简单,适合小白练手.(E语言写的)1.OD加载该软件,输入bp MessageBoxA 2.点击注册 3.OD就会中断下来了 4.按ALT+K打开调用堆栈 5.往上翻,就来到算法处了 ...