我想做一些事情作为CompletableFuture列表中将来完成的订单 [英] I want do something as future done order in CompletableFuture List

查看:106
本文介绍了我想做一些事情作为CompletableFuture列表中将来完成的订单的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一些这样的服务回报 CompletableFutures

I have some service return CompletableFutures like this

Set<CompletableFuture<String>> futures = service.getSomething();

for (CompletableFuture<String> future : futures) {
    System.out.println(future.get());
}

此代码显示值迭代顺序.但是我想像使用 CompletionService 一样先打印快速结果.

This code prints value iterate order. But I want fast result print first like using CompletionService.

Set<CompletableFuture<String>> futures = service.getSomething();
Set<CompletableFuture<String>> donefutures = new HashSet<>();

while (true) {
    if (futures.equals(donefutures)) {
        break;
    }

    futures
            .stream()
            .filter(f -> !donefutures.contains(f))
            .filter(CompletableFuture::isDone)
            .peek(donefutures::add)
            .map(f -> {
                try {
                    return f.get();
                } catch (InterruptedException | ExecutionException e) {
                    return null;
                }
            })
            .forEach(System.out::println);

    Thread.sleep(100);
}

我尝试过这种方式.工作正常但是我觉得真的很丑.有更好的方法吗?

I tried this way. It's working. But I think really ugly. Is there better way?

推荐答案

您正在使用 CompletableFuture ,就像 Future 一样,以阻塞方式运行无限循环.您必须指定在将来完成后将调用的回调函数.

You are working with CompletableFuture like with Future in a blocking way running an infinite loop. You have to specify callback function which will be invoked when your future completes.

因此您可以执行以下操作:

So you can do something like this:

Set<CompletableFuture<String>> futures = service.getSomething();
futures.forEach(future -> future.whenComplete(
        (result, throwable) -> System.out.println(result)
));

CompletableFuture
    .allOf(futures.toArray(new CompletableFuture[0]))
    .join();

这篇关于我想做一些事情作为CompletableFuture列表中将来完成的订单的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆