我遇到了需要使用 CompletableFuture
实现递归的情况。每当任何一个 CompletableFuture 返回任何结果时,我想调用 recursionFuture(ex) ,但我不确定如何实现它。在当前情况下,仅当 future1
和 future2
返回输出且检查条件时才调用 recursionFuture(ex)
。任何帮助将不胜感激。
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();
}
}
最佳答案
您可以将 anyOf()
与 thenRun()
结合起来来实现这一点。只是不要对两个 future 都调用 get()
,因为这会让您的程序等待完成。您可以在调用 get()
之前使用 isDone()
检查 future 是否完成。
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()
将创建一个新的 future,一旦提供的任何 future 完成,该 future 就会完成。 thenRun()
将在调用的 future 完成后立即执行给定的 Runnable
。
关于java - 如何在不等待输出的情况下继续使用 CompletableFuture,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39674193/