2017-06-16 27 views
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); 
} 

我試過這種方式。它正在工作。但我認爲真的很難看。有更好的方法嗎?

回答

1

您正在使用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(); 
+0

需要呼叫未來::得到像'futures.forEach(F - > f.get());'。但它工作迭代順序。我怎麼解決這個問題? –

+0

@ KI-YOUNGBANG爲什麼你需要調用'get()'方法? 'whenComplete'給你執行的結果。 – ledniov

+0

我想等到所有的期貨完成。我剛剛測試'futures.forEach(f - > f.get());'工作。因爲latest.get()被封鎖,而其他時候被完全調用。但我不知道這種方式是正確的。 –

相關問題