我想做一些事情作为CompletableFuture列表中将来完成的订单 [英] I want do something as future done order in CompletableFuture List
本文介绍了我想做一些事情作为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屋!
查看全文