MST

星途 面试题库

面试题:Java 中 CompletableFuture 多个异步任务依赖关系下的状态监控

假设有三个 CompletableFuture 任务 A、B、C,任务 C 需要在任务 A 和任务 B 都成功完成后才能执行。请描述如何实现这种依赖关系,并监控任务 A、B、C 的执行状态,确保任务 C 在正确的时机执行且能及时反馈整个流程的状态信息。
46.5万 热度难度
编程语言Java

知识考点

AI 面试

面试题答案

一键面试

在Java中,可以使用CompletableFuturethenCombine方法来实现任务C依赖任务A和任务B都成功完成后执行,并通过whenComplete方法来监控任务的执行状态。示例代码如下:

import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutionException;

public class CompletableFutureDependencyExample {
    public static void main(String[] args) {
        CompletableFuture<Void> taskA = CompletableFuture.runAsync(() -> {
            // 模拟任务A的执行
            System.out.println("Task A is running...");
            try {
                Thread.sleep(2000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("Task A completed.");
        });

        CompletableFuture<Void> taskB = CompletableFuture.runAsync(() -> {
            // 模拟任务B的执行
            System.out.println("Task B is running...");
            try {
                Thread.sleep(3000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("Task B completed.");
        });

        CompletableFuture<Void> taskC = taskA.thenCombine(taskB, (a, b) -> {
            // 任务C在任务A和B都完成后执行
            System.out.println("Task C is running...");
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("Task C completed.");
            return null;
        });

        taskC.whenComplete((result, ex) -> {
            if (ex == null) {
                System.out.println("All tasks completed successfully.");
            } else {
                System.out.println("An error occurred: " + ex.getMessage());
            }
        });

        // 防止主线程提前退出
        try {
            taskC.get();
        } catch (InterruptedException | ExecutionException e) {
            e.printStackTrace();
        }
    }
}
  1. 创建任务A和任务B
    • 使用CompletableFuture.runAsync方法来异步执行任务A和任务B。这些任务会在独立的线程中运行。
  2. 创建依赖任务C
    • 使用taskA.thenCombine(taskB, ...)方法,该方法接收任务B,并在任务A和任务B都成功完成后执行一个组合操作。这里组合操作中执行任务C的逻辑。
  3. 监控任务执行状态
    • 使用taskC.whenComplete方法,该方法会在任务C完成时(无论是正常完成还是异常完成)被调用。在这个回调中,可以根据是否有异常来判断整个流程是否成功,并输出相应的状态信息。
  4. 防止主线程提前退出
    • 使用taskC.get()方法,该方法会阻塞主线程,直到任务C完成,这样可以确保在所有任务执行完毕后程序才退出。