Java 我想在可完成的未来列表中按未来完成的顺序做一些事情
我有一些服务回报可完成的期货像这样Java 我想在可完成的未来列表中按未来完成的顺序做一些事情,java,future,completable-future,Java,Future,Completable Future,我有一些服务回报可完成的期货像这样 Set<CompletableFuture<String>> futures = service.getSomething(); for (CompletableFuture<String> future : futures) { System.out.println(future.get()); } Set futures=service.getSomething(); for(可完成的未来:未来){ Syst
Set<CompletableFuture<String>> futures = service.getSomething();
for (CompletableFuture<String> future : futures) {
System.out.println(future.get());
}
Set futures=service.getSomething();
for(可完成的未来:未来){
System.out.println(future.get());
}
此代码按迭代顺序打印值。但我希望先使用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);
}
Set futures=service.getSomething();
Set donefutures=new HashSet();
while(true){
if(未来等于(未来){
打破
}
期货
.stream()
.filter(f->!donefutures.contains(f))
.filter(CompletableFuture::isDone)
.peek(donefutures::add)
.map(f->{
试一试{
返回f.get();
}捕获(中断异常|执行异常e){
返回null;
}
})
.forEach(System.out::println);
睡眠(100);
}
我试过这样做。它起作用了。但我觉得很难看。有更好的方法吗?您使用的是
CompletableFuture
就像使用Future
一样,以阻塞方式运行无限循环。您必须指定在将来完成时将调用的回调函数
所以你可以这样做:
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();
Set futures=service.getSomething();
futures.forEach(future->future.whenComplete(
(结果,可丢弃)->System.out.println(结果)
));
完全未来
.allOf(futures.toArray(新的CompletableFuture[0]))
.join();
needcallfuture::get likefutures.forEach(f->f.get())代码>。但它是按迭代顺序工作的。我如何解决这个问题?@KI-YOUNGBANG为什么需要调用get()
方法<代码>whenComplete
为您提供执行结果。我希望等待所有操作完成。我刚刚测试了futures.forEach(f->f.get())代码>工作。因为最近的future.get()被阻止,而其他的则在调用Complete时被阻止。但我不知道这种方法是否正确。@KI-YOUNGBANG您可以做以下操作:CompletableFuture.allOf(futures.toArray(newcompletablefuture[0])).join()代码>并等待完成。请参阅问题。future。如果您不关心可丢弃的,那么accept(System.out::println)
将比使用whenComplete()
更简单