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的使用相关推荐

  1. Java 中的并行处理

    1. 背景 本文是一个短文章,介绍Java 中的并行处理. 说明:10多分钟读完的文章我称之为短文章,适合快速阅读. 2.知识 并行计算(parallel computing)一般是指许多指令得以同时 ...

  2. java中实现具有传递性吗_Java中volatile关键字详解,jvm内存模型,原子性、可见性、有序性...

    一.Java内存模型 想要理解volatile为什么能确保可见性,就要先理解Java中的内存模型是什么样的. Java内存模型规定了所有的变量都存储在主内存中.每条线程中还有自己的工作内存,线程的工作 ...

  3. java中调用python

    在Java中调用Python </h1><div class="clear"></div><div class="postBod ...

  4. java中hashcode_浅谈Java中的Hash值

    1.Hash值有什么用? HashMap.HashTable.HashSet,所以涉及到使用Hash值进行优化存储的地方,都会用到HashCode.HashCode是Key,这种计算为提高计算的性能. ...

  5. JAVA中获取当前系统时间

    JAVA中获取当前系统时间 转自:http://www.cnblogs.com/Matrix54/archive/2012/05/01/2478158.html 一. 获取当前系统时间和日期并格式化输 ...

  6. Java中的对象和包

    什么是对象 对象就是实际生活中的事物,可以说一切事物都是对象. 对象的三个特点 1  对象的行为:这个对象能做什么, 例如包子是用来吃的 2  对象的状态:对象保持的一种状态,例如这个包子是热的还是凉 ...

  7. java中标识符,关键字,数据类型

    什么是标识符? 在java语言中用来给一个类,变量或方法命名的符号 标识符的命名规则 标识符可以由字母.数字.下划线(_).美元符($)组成,但不能包含 @.%.空格等其它特殊字符,不能以数字开头. ...

  8. Java中byte与16进制字符串的互相转换

    https://www.cnblogs.com/qinwangchen/p/5418028.html * Convert byte[] to hex string.这里我们可以将byte转换成int, ...

  9. JAVA中priorityqueue详解

    Java中PriorityQueue通过二叉小顶堆实现,可以用一棵完全二叉树表示.本文从Queue接口函数出发,结合生动的图解,深入浅出地分析PriorityQueue每个操作的具体过程和时间复杂度, ...

最新文章

  1. 第2关:计算二叉树的深度和节点个数
  2. ExclusiveTouch
  3. tkinter回调异常_使用matplotlib保存动画时Tkinter回调出现异常
  4. [转]COPY OR MOVE FILES AND FOLDERS USING OLE AUTOMATION
  5. ES6学习笔记六(Iterator和for..of)
  6. java erlang_Java开发人员的Erlang
  7. php正则表达式提取url,php 正则表达式提取图片url程序
  8. linux build bash,Win10 Build 14316启用Linux Bash 环境图文教程
  9. Scala 深入浅出实战经典 第9讲:Scala的内部类实战详解
  10. 写给自己的总结(程序员励志)
  11. 《微信公众号-腾讯问卷》02-如何在公众号中添加链接
  12. 什么是软件项目管理?
  13. 2048php,Phaser实现2048
  14. c语言输入一批正整数 求其中的偶数和,编程,输入一批整数,先求出其中的偶数和及奇数和,然后输出偶数和与奇数和的差...
  15. rem与px之间的换算
  16. 大数据技术学习推荐书籍(一)
  17. zipkin ui界面详解
  18. Kamiya丨Kamiya艾美捷大鼠成纤维细胞生长因子2说明书
  19. 如何添加操作系统启动项
  20. DTS 宣布华硕 ROG Phone 将支持 DTS:X Ultra 技术

热门文章

  1. C语言/C++基础知识
  2. shell脚本报错:-bash: xxx: /bin/sh^M: bad interpreter: No such file or directory
  3. VC批量拷贝,移动,删除文件---SHFileOperation
  4. 私有化仓库的 GO 模块使用实践
  5. 大厂门槛:技术力+领导力,你达标了吗?
  6. 干货!全面认识Docker和基本指令
  7. 改来改去把微服务改成了分布式单体
  8. 本地存储和移动端js框架及bootstrap简介
  9. 【公开课预告】:多媒体开源PI
  10. 来自曾经一起“挥洒汗水”的志愿者伙伴们的一封信