博客
关于我
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/

你可能感兴趣的文章
mysql中的数据导入与导出
查看>>
MySQL中的时间函数
查看>>
mysql中的约束
查看>>
MySQL中的表是什么?
查看>>
mysql中穿件函数时候delimiter的用法
查看>>
Mysql中索引的分类、增删改查与存储引擎对应关系
查看>>
Mysql中索引的最左前缀原则图文剖析(全)
查看>>
MySql中给视图添加注释怎么添加_默认不支持_可以这样取巧---MySql工作笔记002
查看>>
Mysql中获取所有表名以及表名带时间字符串使用BetweenAnd筛选区间范围
查看>>
Mysql中视图的使用以及常见运算符的使用示例和优先级
查看>>
Mysql中触发器的使用示例
查看>>
Mysql中设置只允许指定ip能连接访问(可视化工具的方式)
查看>>
mysql中还有窗口函数?这是什么东西?
查看>>
mysql中间件
查看>>
MYSQL中频繁的乱码问题终极解决
查看>>
MySQL为Null会导致5个问题,个个致命!
查看>>
MySQL为什么不建议使用delete删除数据?
查看>>
MySQL主从、环境搭建、主从配制
查看>>
Mysql主从不同步
查看>>
mysql主从同步及清除信息
查看>>