MST
星途 面试题库

面试题:Java中CompletableFuture如何实现异步任务的顺序执行

假设你有两个异步任务,任务A和任务B,任务B需要依赖任务A的执行结果。请使用CompletableFuture编写Java代码来实现这种顺序执行的逻辑,并简要说明其中涉及的方法和原理。
37.0万 热度难度
编程语言Java

知识考点

AI 面试

面试题答案

一键面试
import java.util.concurrent.CompletableFuture;

public class AsyncTaskExample {
    public static void main(String[] args) {
        CompletableFuture.supplyAsync(() -> {
            // 模拟任务A
            System.out.println("任务A开始执行");
            try {
                Thread.sleep(2000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("任务A执行完毕");
            return "任务A的结果";
        }).thenApplyAsync(result -> {
            // 任务B依赖任务A的结果
            System.out.println("任务B开始执行,依赖任务A的结果: " + result);
            try {
                Thread.sleep(2000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("任务B执行完毕");
            return "任务B的最终结果";
        }).thenAccept(System.out::println);
    }
}

涉及的方法和原理

  1. supplyAsync
    • 这是CompletableFuture类的静态方法,用于异步执行一个有返回值的任务。它接收一个Supplier作为参数,在新的线程中执行Supplierget方法,并返回一个CompletableFuture对象,该对象在任务完成时包含Supplier的返回值。
  2. thenApplyAsync
    • 这个方法用于在当前CompletableFuture完成后,异步执行一个Function。它接收一个Function作为参数,该Function的输入是当前CompletableFuture的结果,输出是新的结果。它返回一个新的CompletableFuture,该CompletableFutureFunction执行完成时完成,并包含Function的返回值。这里任务B依赖任务A的结果,就通过thenApplyAsync将任务A的结果作为输入来执行任务B。
  3. thenAccept
    • 此方法用于在当前CompletableFuture完成时,异步执行一个Consumer。它接收一个Consumer作为参数,该Consumer的输入是当前CompletableFuture的结果。这里使用thenAccept来打印任务B的最终结果。

整个流程就是通过CompletableFuture的链式调用,实现任务A先执行,任务B依赖任务A的结果再执行的顺序执行逻辑。