Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/335.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 我想在可完成的未来列表中按未来完成的顺序做一些事情_Java_Future_Completable Future - Fatal编程技术网

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 like
futures.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()
更简单