0
我有一些服務回報CompletableFutures這樣我想要做一些未來的成交訂單在CompletableFuture列表
Set<CompletableFuture<String>> futures = service.getSomething();
for (CompletableFuture<String> future : futures) {
System.out.println(future.get());
}
該代碼打印值迭代順序。但我希望首先使用完成服務。
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);
}
我試過這種方式。它正在工作。但我認爲真的很難看。有更好的方法嗎?
需要呼叫未來::得到像'futures.forEach(F - > f.get());'。但它工作迭代順序。我怎麼解決這個問題? –
@ KI-YOUNGBANG爲什麼你需要調用'get()'方法? 'whenComplete'給你執行的結果。 – ledniov
我想等到所有的期貨完成。我剛剛測試'futures.forEach(f - > f.get());'工作。因爲latest.get()被封鎖,而其他時候被完全調用。但我不知道這種方式是正確的。 –