0

我遇到了需要用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(); 
     } 
    } 

回答

1

您可以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); –

0

如果您只使用兩個CompletableFutures,您還可以看看runAfterEither/runAfterEitherAsync。還有一些版本允許訪問像acceptEither/acceptEitherAsync這樣返回的值。

相關問題