Java并发编程实战:CompletableFuture异步编排深度解析
一、CompletableFuture核心优势
相比Future接口,CompletableFuture提供更强大的异步编程能力:
// 传统Future获取结果
ExecutorService executor = Executors.newFixedThreadPool(2);
Future<String> future = executor.submit(() -> {
Thread.sleep(1000);
return "结果";
});
// CompletableFuture实现
CompletableFuture<String> cf = CompletableFuture.supplyAsync(() -> {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
return "结果";
}, executor);
核心特性:链式调用、异常处理、组合操作
二、任务编排四象限
1. 串行执行
CompletableFuture<String> cf = CompletableFuture
.supplyAsync(() -> "Hello")
.thenApply(s -> s + " World")
.thenApply(String::toUpperCase);
System.out.println(cf.get()); // 输出: HELLO WORLD
2. 并行聚合
CompletableFuture<String> cf1 = queryFromDB();
CompletableFuture<String> cf2 = queryFromAPI();
CompletableFuture<String> result = cf1
.thenCombine(cf2, (db, api) -> db + "|" + api);
三、电商订单实战案例
1. 多服务并行调用
public OrderResult getOrderDetail(Long orderId) {
CompletableFuture<Order> orderFuture = getOrderAsync(orderId);
CompletableFuture<User> userFuture = getUserAsync(orderId);
CompletableFuture<List<Product>> productsFuture = getProductsAsync(orderId);
return CompletableFuture.allOf(orderFuture, userFuture, productsFuture)
.thenApply(v -> {
Order order = orderFuture.join();
User user = userFuture.join();
List<Product> products = productsFuture.join();
return new OrderResult(order, user, products);
}).join();
}
四、性能优化策略
- 自定义线程池:避免使用默认ForkJoinPool
- 超时控制:orTimeout()方法设置超时
- 异常隔离:handle()统一处理异常
- 结果缓存:completeOnTimeout()设置默认值
// 带超时和异常处理的完整示例
CompletableFuture<String> cf = CompletableFuture
.supplyAsync(() -> {
if (Math.random() > 0.5) {
throw new RuntimeException("模拟异常");
}
return "正常结果";
}, customExecutor)
.orTimeout(2, TimeUnit.SECONDS)
.handle((res, ex) -> {
if (ex != null) {
return "异常默认值";
}
return res;
});