Java CompletableFuture实战:异步编程与多任务编排
在现代Java应用中,异步编程已成为提升性能的关键技术。本文将深入探讨Java 8引入的CompletableFuture类,展示如何优雅地处理异步任务和多任务编排。
1. 基础异步任务创建
创建并运行一个简单的异步任务:
CompletableFuture<String> future = CompletableFuture.supplyAsync(() -> {
try {
Thread.sleep(1000); // 模拟耗时操作
} catch (InterruptedException e) {
e.printStackTrace();
}
return “任务完成”;
});
// 异步获取结果
future.thenAccept(result -> System.out.println(“结果: ” + result));
2. 多任务组合编排
实现任务A和任务B并行执行,任务C依赖前两个任务的结果:
CompletableFuture<String> userFuture = CompletableFuture.supplyAsync(() -> {
return “用户ID:123”;
});
// 模拟获取订单信息
CompletableFuture<String> orderFuture = CompletableFuture.supplyAsync(() -> {
return “订单ID:456”;
});
// 组合两个任务结果
CompletableFuture<String> combinedFuture =
userFuture.thenCombine(orderFuture, (user, order) -> {
return “合并结果: ” + user + “, ” + order;
});
// 处理最终结果
combinedFuture.thenAccept(System.out::println);
3. 异常处理机制
CompletableFuture提供了多种异常处理方式:
if (Math.random() > 0.5) {
throw new RuntimeException(“模拟异常”);
}
return “成功结果”;
}).handle((result, ex) -> {
if (ex != null) {
return “异常处理: ” + ex.getMessage();
}
return result;
}).thenAccept(System.out::println);
4. 实际应用案例
电商系统中的商品详情页数据聚合:
CompletableFuture<Product> productFuture = CompletableFuture.supplyAsync(
() -> productService.getProduct(id), ioThreadPool);
// 2. 并行获取商品评价
CompletableFuture<List<Review>> reviewsFuture = CompletableFuture.supplyAsync(
() -> reviewService.getReviews(id), ioThreadPool);
// 3. 并行获取推荐商品
CompletableFuture<List<Product>> recommendsFuture = CompletableFuture.supplyAsync(
() -> recommendService.getRecommends(id), ioThreadPool);
// 组合所有结果
CompletableFuture<ProductDetail> detailFuture =
productFuture.thenCombine(reviewsFuture, (product, reviews) -> {
ProductDetail detail = new ProductDetail();
detail.setProduct(product);
detail.setReviews(reviews);
return detail;
}).thenCombine(recommendsFuture, (detail, recommends) -> {
detail.setRecommends(recommends);
return detail;
});
// 返回结果或进一步处理
return detailFuture;
通过CompletableFuture,我们可以轻松实现复杂的异步编程场景,大幅提升Java应用的并发性能和响应速度。