java中CompletionService的使用
java中CompletionService的使用
之前的文章中我们讲到了ExecutorService,通过ExecutorService我们可以提交一个个的task,并且返回Future,然后通过调用Future.get方法来返回任务的执行结果。
这种方式虽然有效,但是需要保存每个返回的Future值,还是比较麻烦的,幸好ExecutorService提供了一个invokeAll的方法,来保存所有的Future值,我们看一个具体的实现:
public void useExecutorService() throws InterruptedException {ExecutorService executor = Executors.newFixedThreadPool(10);Callable<String> callableTask = () -> {TimeUnit.MILLISECONDS.sleep(300);return "Task's execution";};List<Callable<String>> callableTasks = new ArrayList<>();callableTasks.add(callableTask);callableTasks.add(callableTask);callableTasks.add(callableTask);List<Future<String>> futures = executor.invokeAll(callableTasks);executor.shutdown();}
上面的例子中,我们定义了3个task,通过调用executor.invokeAll(callableTasks)返回了一个 List<Future>,这样我们就可以得到所有的返回值了。
除了上面的invokeAll方法外,我们今天要介绍一个CompletionService接口。
CompletionService实际上是ExecutorService和BlockingQueue的结合体,ExecutorService用来提交任务,而BlockingQueue用来保存封装成Future的执行结果。通过调用take和poll的方法来获取到Future值。
CompletionService是一个接口,我们看下它的一个具体实现ExecutorCompletionService:
public ExecutorCompletionService(Executor executor) {if (executor == null)throw new NullPointerException();this.executor = executor;this.aes = (executor instanceof AbstractExecutorService) ?(AbstractExecutorService) executor : null;this.completionQueue = new LinkedBlockingQueue<Future<V>>();}
ExecutorCompletionService接收一个Executor作为参数。
我们看下上面的例子如果用ExecutorCompletionService重写是怎么样的:
public void useCompletionService() throws InterruptedException, ExecutionException {ExecutorService executor = Executors.newFixedThreadPool(10);CompletionService<String> completionService=new ExecutorCompletionService<String>(executor);Callable<String> callableTask = () -> {TimeUnit.MILLISECONDS.sleep(300);return "Task's execution";};for(int i=0; i< 5; i ++){completionService.submit(callableTask);}for(int i=0; i<5; i++){Future<String> result=completionService.take();System.out.println(result.get());}}
上面的例子通过completionService.submit来提交任务,通过completionService.take()来获取结果值。
其实CompletionService还有一个poll的方法,poll和take的区别在于:take如果获取不到值则会等待,而poll则会返回null。
本文的例子可以参考https://github.com/ddean2009/learn-java-concurrency/tree/master/CompletionService
更多精彩内容且看:
- 区块链从入门到放弃系列教程-涵盖密码学,超级账本,以太坊,Libra,比特币等持续更新
- Spring Boot 2.X系列教程:七天从无到有掌握Spring Boot-持续更新
- Spring 5.X系列教程:满足你对Spring5的一切想象-持续更新
- java程序员从小工到专家成神之路(2020版)-持续更新中,附详细文章教程
更多内容请访问 flydean的博客
java中CompletionService的使用相关推荐
- Java 中的并行处理
1. 背景 本文是一个短文章,介绍Java 中的并行处理. 说明:10多分钟读完的文章我称之为短文章,适合快速阅读. 2.知识 并行计算(parallel computing)一般是指许多指令得以同时 ...
- java中实现具有传递性吗_Java中volatile关键字详解,jvm内存模型,原子性、可见性、有序性...
一.Java内存模型 想要理解volatile为什么能确保可见性,就要先理解Java中的内存模型是什么样的. Java内存模型规定了所有的变量都存储在主内存中.每条线程中还有自己的工作内存,线程的工作 ...
- java中调用python
在Java中调用Python </h1><div class="clear"></div><div class="postBod ...
- java中hashcode_浅谈Java中的Hash值
1.Hash值有什么用? HashMap.HashTable.HashSet,所以涉及到使用Hash值进行优化存储的地方,都会用到HashCode.HashCode是Key,这种计算为提高计算的性能. ...
- JAVA中获取当前系统时间
JAVA中获取当前系统时间 转自:http://www.cnblogs.com/Matrix54/archive/2012/05/01/2478158.html 一. 获取当前系统时间和日期并格式化输 ...
- Java中的对象和包
什么是对象 对象就是实际生活中的事物,可以说一切事物都是对象. 对象的三个特点 1 对象的行为:这个对象能做什么, 例如包子是用来吃的 2 对象的状态:对象保持的一种状态,例如这个包子是热的还是凉 ...
- java中标识符,关键字,数据类型
什么是标识符? 在java语言中用来给一个类,变量或方法命名的符号 标识符的命名规则 标识符可以由字母.数字.下划线(_).美元符($)组成,但不能包含 @.%.空格等其它特殊字符,不能以数字开头. ...
- Java中byte与16进制字符串的互相转换
https://www.cnblogs.com/qinwangchen/p/5418028.html * Convert byte[] to hex string.这里我们可以将byte转换成int, ...
- JAVA中priorityqueue详解
Java中PriorityQueue通过二叉小顶堆实现,可以用一棵完全二叉树表示.本文从Queue接口函数出发,结合生动的图解,深入浅出地分析PriorityQueue每个操作的具体过程和时间复杂度, ...
最新文章
- 第2关:计算二叉树的深度和节点个数
- ExclusiveTouch
- tkinter回调异常_使用matplotlib保存动画时Tkinter回调出现异常
- [转]COPY OR MOVE FILES AND FOLDERS USING OLE AUTOMATION
- ES6学习笔记六(Iterator和for..of)
- java erlang_Java开发人员的Erlang
- php正则表达式提取url,php 正则表达式提取图片url程序
- linux build bash,Win10 Build 14316启用Linux Bash 环境图文教程
- Scala 深入浅出实战经典 第9讲:Scala的内部类实战详解
- 写给自己的总结(程序员励志)
- 《微信公众号-腾讯问卷》02-如何在公众号中添加链接
- 什么是软件项目管理?
- 2048php,Phaser实现2048
- c语言输入一批正整数 求其中的偶数和,编程,输入一批整数,先求出其中的偶数和及奇数和,然后输出偶数和与奇数和的差...
- rem与px之间的换算
- 大数据技术学习推荐书籍(一)
- zipkin ui界面详解
- Kamiya丨Kamiya艾美捷大鼠成纤维细胞生长因子2说明书
- 如何添加操作系统启动项
- DTS 宣布华硕 ROG Phone 将支持 DTS:X Ultra 技术
热门文章
- C语言/C++基础知识
- shell脚本报错:-bash: xxx: /bin/sh^M: bad interpreter: No such file or directory
- VC批量拷贝,移动,删除文件---SHFileOperation
- 私有化仓库的 GO 模块使用实践
- 大厂门槛:技术力+领导力,你达标了吗?
- 干货!全面认识Docker和基本指令
- 改来改去把微服务改成了分布式单体
- 本地存储和移动端js框架及bootstrap简介
- 【公开课预告】:多媒体开源PI
- 来自曾经一起“挥洒汗水”的志愿者伙伴们的一封信