我遇到了需要使用CompletableFuture
实现递归的情况。我想在任何recursionFuture(ex)
s返回任何结果时调用CompletableFuture
,但我不知道如何实现它。在当前情况下,仅当recursionFuture(ex)
和future1
都返回输出然后检查条件时才会调用future2
。任何帮助将不胜感激。
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();
}
}
答案 0 :(得分:1)
您可以将anyOf()
与thenRun()
合并来实现这一目标。只是不要在两个期货上都致电get()
,因为它会让您的程序等待完成。在调用isDone()
之前,您可以使用get()
检查未来是否已完成。
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
。
答案 1 :(得分:0)
如果您只使用两个CompletableFutures,您还可以查看runAfterEither / runAfterEitherAsync。还有一些版本允许访问返回的值,如acceptEither / acceptEitherAsync。