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);
🚀 效果:适用于多源查询、冗余备份方案,提升系统响应速度。