2017-06-16 72 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()被封锁,而其他时候被完全调用。但我不知道这种方式是正确的。 –

相关问题