如何在不等待输出的情况下继续CompletableFuture

问题描述:

我遇到了需要用CompletableFuture实现递归的情况。无论何时CompletableFuture s返回任何结果,我都想致电recursionFuture(ex),但我不确定该如何实现该结果。在当前情况下,只有当future1future2返回输出,然后检查条件时才调用recursionFuture(ex)。任何帮助,将不胜感激。如何在不等待输出的情况下继续CompletableFuture

public static void recursionFuture(ExecutorService ex) 
    { 
     try 
     { 
      CompletableFuture<Object> future1 = CompletableFuture.supplyAsync(() -> new ConcurrencyPoC_CompletableFuture().executeTask(), ex); 
      CompletableFuture<Object> future2 = CompletableFuture.supplyAsync(() -> new ConcurrencyPoC_CompletableFuture().executeTask(), ex); 

      if (future1.get() != null | future2.get() != null) 
      { 
       System.out.println("Future1: " + future1.get() + " Future2: " + future2.get()); 
       recursionFuture(ex); 
      } 
     } 
     catch(Exception e) 
     { 
      e.printStackTrace(); 
     } 
    } 

您可以thenRun()结合anyOf()来实现这一目标。不要在期货中致电get(),因为它会让您的计划等待完成。在致电get()之前,您可以使用isDone()来检查未来是否完成。

CompletableFuture<Object> future1 = CompletableFuture.supplyAsync(() -> new ConcurrencyPoC_CompletableFuture().executeTask(), ex); 
CompletableFuture<Object> future2 = CompletableFuture.supplyAsync(() -> new ConcurrencyPoC_CompletableFuture().executeTask(), ex); 

CompletableFuture.anyOf(future1, future2).thenRun(() -> { 
    if (future1.isDone()) { 
     System.out.println("Future 1: " + future1.get()); 
    } 
    if (future2.isDone()) { 
     System.out.println("Future 2: " + future2.get()); 
    } 
    recursionFuture(ex); 
}); 

anyOf()将创建一个新的未来,将尽快任何提供期货已完成完成。 thenRun()将在完成调用未来之后立即执行给定的Runnable

+0

谢谢安德鲁,这个工程,但有一个小问题。由于递归,即使executeTask()没有返回任何东西并继续无限期地继续执行代码。是否有可能检查未来的输出像futire1.get()!= null然后调用递归,但与前面提到的问题发生。你能在这里建议吗? –

+0

嗯,我通过编辑代码一样得到这个工作:CompletableFuture.anyOf(future1,future2).thenRunAsync(() - > \t \t \t { \t \t \t \t recursionFuture(除息); \t \t \t} \t \t ex); \t \t \t,ex); –

如果您只使用两个CompletableFutures,您还可以看看runAfterEither/runAfterEitherAsync。还有一些版本允许访问像acceptEither/acceptEitherAsync这样返回的值。