MST

星途 面试题库

面试题:Java 中 CompletableFuture 多任务并行与顺序结合执行

假设有多个异步任务,其中部分任务需要并行执行,并行执行完成后再有一个任务依赖于这些并行任务的结果顺序执行。请使用 CompletableFuture 设计一个示例代码实现此场景,包括对各个任务逻辑的简单描述以及关键代码段的注释解释。
43.0万 热度难度
编程语言Java

知识考点

AI 面试

面试题答案

一键面试
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class CompletableFutureExample {
    public static void main(String[] args) throws ExecutionException, InterruptedException {
        // 创建线程池
        ExecutorService executorService = Executors.newFixedThreadPool(3);

        // 定义并行执行的任务1
        CompletableFuture<String> task1 = CompletableFuture.supplyAsync(() -> {
            System.out.println("Task1 is running asynchronously.");
            // 模拟一些耗时操作
            try {
                Thread.sleep(2000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            return "Result of Task1";
        }, executorService);

        // 定义并行执行的任务2
        CompletableFuture<String> task2 = CompletableFuture.supplyAsync(() -> {
            System.out.println("Task2 is running asynchronously.");
            // 模拟一些耗时操作
            try {
                Thread.sleep(1500);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            return "Result of Task2";
        }, executorService);

        // 定义依赖于并行任务结果的顺序执行任务
        CompletableFuture<Void> combinedTask = CompletableFuture.allOf(task1, task2)
               .thenRun(() -> {
                    try {
                        System.out.println("Combined task starts, depends on Task1 and Task2.");
                        System.out.println("Task1 result: " + task1.get());
                        System.out.println("Task2 result: " + task2.get());
                        // 模拟依赖任务的一些操作
                        Thread.sleep(1000);
                        System.out.println("Combined task finishes.");
                    } catch (InterruptedException | ExecutionException e) {
                        e.printStackTrace();
                    }
                });

        // 等待所有任务完成
        combinedTask.get();

        // 关闭线程池
        executorService.shutdown();
    }
}

代码说明

  1. 线程池创建
    • ExecutorService executorService = Executors.newFixedThreadPool(3); 创建一个固定大小为3的线程池,用于异步执行任务。
  2. 并行任务定义
    • task1task2 是两个并行执行的任务,使用 CompletableFuture.supplyAsync 方法,传入一个有返回值的任务和线程池。每个任务模拟了一个耗时操作,并返回任务执行结果。
  3. 依赖任务定义
    • CompletableFuture.allOf(task1, task2) 等待 task1task2 都完成。
    • .thenRun(() -> {... })task1task2 都完成后,执行后续任务。在这个后续任务中,获取 task1task2 的结果,并模拟了一些依赖于前两个任务结果的操作。
  4. 等待任务完成并关闭线程池
    • combinedTask.get(); 等待所有任务完成。
    • executorService.shutdown(); 关闭线程池。