我想在 CompletableFuture List 中做一些事情作为未来完成的订单
I want do something as future done order in CompletableFuture List
我有这样的服务returnCompletableFutures
Set<CompletableFuture<String>> futures = service.getSomething();
for (CompletableFuture<String> future : futures) {
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);
}
我试过这种方法。它的工作。但是我觉得真的很难看。有没有更好的办法?
您使用 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();
我有这样的服务returnCompletableFutures
Set<CompletableFuture<String>> futures = service.getSomething();
for (CompletableFuture<String> future : futures) {
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);
}
我试过这种方法。它的工作。但是我觉得真的很难看。有没有更好的办法?
您使用 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();