如何在不等待输出的情况下继续CompletableFuture
问题描述:
我遇到了需要用CompletableFuture
实现递归的情况。无论何时CompletableFuture
s返回任何结果,我都想致电recursionFuture(ex)
,但我不确定该如何实现该结果。在当前情况下,只有当future1
和future2
返回输出,然后检查条件时才调用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
。
答
如果您只使用两个CompletableFutures,您还可以看看runAfterEither/runAfterEitherAsync。还有一些版本允许访问像acceptEither/acceptEitherAsync这样返回的值。
谢谢安德鲁,这个工程,但有一个小问题。由于递归,即使executeTask()没有返回任何东西并继续无限期地继续执行代码。是否有可能检查未来的输出像futire1.get()!= null然后调用递归,但与前面提到的问题发生。你能在这里建议吗? –
嗯,我通过编辑代码一样得到这个工作:CompletableFuture.anyOf(future1,future2).thenRunAsync(() - > \t \t \t { \t \t \t \t recursionFuture(除息); \t \t \t} \t \t ex); \t \t \t,ex); –