CompletableFuture

1、CompletableFuture

是一个可以:
• 异步执行任务;
• 串联多个任务;
• 组合多个并行任务;
• 提供异常与超时处理;

的强大异步编程工具。
一句话:它让你写异步代码,像写同步逻辑一样自然。

CompletableFuture 常用经典场景(项目实战)

在真实项目中,CompletableFuture 能显著提高并发性能与代码可读性。以下是常见的八大场景👇

1️⃣ 并行执行多个独立任务(性能提升)

适用于同时发起多个无依赖请求的场景,例如订购或用户画像模块:

CompletableFuture<List<Order>> ordersFuture = CompletableFuture.supplyAsync(() -> getUserOrders(userId));
CompletableFuture<List<Recommendation>> recommendFuture = CompletableFuture.supplyAsync(() -> getRecommendations(userId));

// 等待所有任务完成并组合结果
CompletableFuture.allOf(userFuture, ordersFuture, recommendFuture).join();

UserProfile profile = new UserProfile(
    userFuture.get(), 
    ordersFuture.get(), 
    recommendFuture.get()
);

📈 效果:多个慢请求并行执行,整体性能大幅提升。

2️⃣ 异步等待响应(信令 / 消息场景)

常见于需要等待外部系统回调的业务:

CompletableFuture<Response> future = new CompletableFuture<>();
requestMap.put(requestId, future);
sendRequest(request);

try {
    return future.get(5, TimeUnit.SECONDS); // 设置超时
} catch (TimeoutException e) {
    return handleTimeout();
}

📬 用法亮点:CompletableFuture 自身就能当“Promise”,
可在回调到来时 future.complete(response),轻松唤醒等待线程。

3️⃣ 链式异步处理(多步骤处理)

适用于数据流式处理:

CompletableFuture.supplyAsync(() -> fetchUserData(userId))
                 .thenApply(UserService::validateUser)
                 .thenCompose(UserService::loadUserPreferences)
                 .thenApply(RecommendationService::generateRecommendations)
                 .thenAccept(RecommendationService::cacheRecommendations)
                 .exceptionally(this::handleException);

📊 特点:可读性高、模块化清晰、天然支持异步。

4️⃣ 条件分支处理

根据异步结果的不同选择处理逻辑:

CompletableFuture<String> future = CompletableFuture.supplyAsync(() -> fetchData())
    .thenCompose(data -> {
        if (data.isComplete()) {
            return CompletableFuture.completedFuture(data.getContent());
        } else {
            return CompletableFuture.supplyAsync(() -> processIncompleteData(data));
        }
    });

📍应用场景:数据完整性判断、动态工作流。

5️⃣ 超时控制

保证系统响应性:

CompletableFuture<String> future = CompletableFuture.supplyAsync(() -> longRunningTask());

try {
    String result = future.get(3, TimeUnit.SECONDS);
} catch (TimeoutException e) {
    future.cancel(true);
    handleTimeout();
}

⏰ 价值:防止异步任务无限等待,保护主流程。

6️⃣ 错误处理与恢复机制

CompletableFuture<String> future = CompletableFuture.supplyAsync(() -> riskyOperation())
    .exceptionally(e -> {
        logger.error("操作失败", e);
        return "default-value";
    });

🛡️ 亮点:允许设置降级值,不影响整体执行流。

7️⃣ 多任务结果组合

CompletableFuture<String> f1 = CompletableFuture.supplyAsync(() -> service1.getData());
CompletableFuture<String> f2 = CompletableFuture.supplyAsync(() -> service2.getData());

CompletableFuture<String> combined = f1.thenCombine(f2, (r1, r2) -> r1 + " - " + r2);

📦 场景:微服务结果聚合、并发接口结果整合。

8️⃣ 优先级结果处理(取最快结果)

CompletableFuture<String> remote = CompletableFuture.supplyAsync(() -> remoteService.getData());
CompletableFuture<String> cache = CompletableFuture.supplyAsync(() -> cacheService.getData());

CompletableFuture<Object> result = CompletableFuture.anyOf(remote, cache);

🚀 效果:适用于多源查询、冗余备份方案,提升系统响应速度。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容