java - 如何在不等待输出的情况下继续使用 CompletableFuture

标签 java multithreading threadpool executorservice completable-future

我遇到了需要使用 CompletableFuture 实现递归的情况。每当任何一个 CompletableFuture 返回任何结果时,我想调用 recursionFuture(ex) ,但我不确定如何实现它。在当前情况下,仅当 future1future2 返回输出且检查条件时才调用 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/

相关文章:

c# - 在 ZeroMQ C# 中断开套接字

java - 有界类型参数 - 是否包含上限?

c# - 从多个线程无锁写入文件

java - 内联创建的 InputStream 是否被 GC 自动关闭?

C 线程程序

c++ - boost 线程池

java - 通过创建线程池在运行 JUnit 测试脚本时在线程之间添加延迟

java - ExecutorService 对单个线程的时间限制

java - 使用 Argparse4j 的命令行参数设置标志

java - Deadbolt 2 和 Play 2.4.x : Null pointer exception on unaccessible pages