博客
关于我
java中CompletionService的使用
阅读量:423 次
发布时间:2019-03-06

本文共 2441 字,大约阅读时间需要 8 分钟。

java中CompletionService的使用

之前的文章中我们讲到了ExecutorService,通过ExecutorService我们可以提交一个个的task,并且返回Future,然后通过调用Future.get方法来返回任务的执行结果。

这种方式虽然有效,但是需要保存每个返回的Future值,还是比较麻烦的,幸好ExecutorService提供了一个invokeAll的方法,来保存所有的Future值,我们看一个具体的实现:

public void useExecutorService() throws InterruptedException {        ExecutorService executor = Executors.newFixedThreadPool(10);        Callable
callableTask = () -> { TimeUnit.MILLISECONDS.sleep(300); return "Task's execution"; }; List
> callableTasks = new ArrayList<>(); callableTasks.add(callableTask); callableTasks.add(callableTask); callableTasks.add(callableTask); List
> 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
>(); }

ExecutorCompletionService接收一个Executor作为参数。

我们看下上面的例子如果用ExecutorCompletionService重写是怎么样的:

public void useCompletionService() throws InterruptedException, ExecutionException {        ExecutorService executor = Executors.newFixedThreadPool(10);        CompletionService
completionService=new ExecutorCompletionService
(executor); Callable
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
result=completionService.take(); System.out.println(result.get()); } }

上面的例子通过completionService.submit来提交任务,通过completionService.take()来获取结果值。

其实CompletionService还有一个poll的方法,poll和take的区别在于:take如果获取不到值则会等待,而poll则会返回null。

本文的例子可以参考

更多内容请访问

转载地址:http://wenuz.baihongyu.com/

你可能感兴趣的文章
MongoDB可视化客户端管理工具之NoSQLbooster4mongo
查看>>
Mongodb学习总结(1)——常用NoSql数据库比较
查看>>
MongoDB学习笔记(8)--索引及优化索引
查看>>
mongodb定时备份数据库
查看>>
mppt算法详解-ChatGPT4o作答
查看>>
mpvue的使用(一)必要的开发环境
查看>>
MQ 重复消费如何解决?
查看>>
mqtt broker服务端
查看>>
MQTT 保留消息
查看>>
MQTT 持久会话与 Clean Session 详解
查看>>
MQTT介绍及与其他协议的比较
查看>>
MQTT工作笔记0007---剩余长度
查看>>
MQTT工作笔记0008---服务质量
查看>>
MQTT工作笔记0009---订阅主题和订阅确认
查看>>
Mqtt搭建代理服务器进行通信-浅析
查看>>
MS COCO数据集介绍
查看>>
MS Edge浏览器“STATUS_INVALID_IMAGE_HASH“兼容性问题
查看>>
ms sql server 2008 sp2更新异常
查看>>
MS SQL查询库、表、列数据结构信息汇总
查看>>
MS UC 2013-0-Prepare Tool
查看>>