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

时间:2016-09-24 08:24:28

标签: java multithreading threadpool executorservice completable-future

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

2 个答案:

答案 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。