MST

星途 面试题库

面试题:Java 中 CompletableFuture 的常见使用场景有哪些

请简要描述在 Java 项目中,CompletableFuture 通常会应用在哪些场景下,例如异步计算、并行处理等,并举例说明。
16.0万 热度难度
编程语言Java

知识考点

AI 面试

面试题答案

一键面试

应用场景

  1. 异步计算:当某个操作不需要立即获取结果,且希望主线程不被阻塞时,可使用 CompletableFuture 进行异步计算。例如在一个电商系统中,计算商品的推荐列表,这个过程可能比较耗时,使用 CompletableFuture 可以在后台线程进行计算,主线程继续处理其他请求。
  2. 并行处理:多个独立的任务可以并行执行,然后合并结果。比如在数据分析场景下,从多个数据源获取数据并进行分析,每个数据源的获取操作可并行执行,最后合并分析结果。
  3. 依赖关系处理:任务之间存在依赖关系时,CompletableFuture 可以方便地处理。例如先进行用户认证,认证通过后再获取用户的详细信息。

示例

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

public class CompletableFutureExample {
    public static void main(String[] args) throws ExecutionException, InterruptedException {
        // 异步计算示例
        CompletableFuture<Integer> future = CompletableFuture.supplyAsync(() -> {
            // 模拟耗时操作
            try {
                Thread.sleep(2000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            return 42;
        });
        // 获取异步计算结果
        Integer result = future.get();
        System.out.println("异步计算结果: " + result);

        // 并行处理示例
        CompletableFuture<Integer> future1 = CompletableFuture.supplyAsync(() -> 10);
        CompletableFuture<Integer> future2 = CompletableFuture.supplyAsync(() -> 20);
        CompletableFuture<Integer> combinedFuture = future1.thenCombine(future2, (a, b) -> a + b);
        Integer combinedResult = combinedFuture.get();
        System.out.println("并行处理合并结果: " + combinedResult);

        // 依赖关系处理示例
        CompletableFuture<Boolean> authFuture = CompletableFuture.supplyAsync(() -> {
            // 模拟认证操作
            return true;
        });
        CompletableFuture<String> userInfoFuture = authFuture.thenApplyAsync(auth -> {
            if (auth) {
                return "用户详细信息";
            } else {
                return "认证失败,无法获取信息";
            }
        });
        String userInfo = userInfoFuture.get();
        System.out.println("依赖关系处理结果: " + userInfo);
    }
}