Java基础教程(151)多线程之使用CompletableFuture:解锁并发新姿势,CompletableFuture让多线程飞起来

在Java多线程编程中,Future一直作为异步计算的基石存在,但其获取结果时需要阻塞线程的局限性催生了更强大的CompletableFuture。它不仅实现了Future接口,更提供了丰富的组合式异步编程能力。

传统Future的局限性

传统的Future通过get()方法获取结果时会导致阻塞,若要实现多个异步计算结果的组合则需要手动同步,代码复杂度急剧上升:

ExecutorService executor = Executors.newCachedThreadPool();
Future<String> future = executor.submit(() -> {
    Thread.sleep(2000);
    return "Result";
});

// 阻塞直到获取结果
String result = future.get(); 

CompletableFuture的核心优势

CompletableFuture通过回调机制避免了阻塞,支持链式调用和组合操作:

CompletableFuture.supplyAsync(() -> "Hello")
    .thenApply(s -> s + " World")
    .thenAccept(System.out::println);

实战示例:电商价格计算

假设需要异步获取商品基础价格、折扣和税率,最后计算最终价格:

CompletableFuture<Double> basePrice = CompletableFuture.supplyAsync(() -> getBasePrice(productId));
CompletableFuture<Double> discount = CompletableFuture.supplyAsync(() -> getDiscount(productId));
CompletableFuture<Double> tax = CompletableFuture.supplyAsync(() -> getTaxRate(productId));

CompletableFuture<Double> finalPrice = basePrice
    .thenCombine(discount, (b, d) -> b * (1 - d))
    .thenCombine(tax, (price, t) -> price * (1 + t));

finalPrice.thenAccept(price -> System.out.println("最终价格: " + price));

异常处理机制

CompletableFuture提供exceptionally方法优雅处理异常:

CompletableFuture.supplyAsync(() -> {
    if (new Random().nextBoolean()) {
        throw new RuntimeException("模拟异常");
    }
    return "Success";
}).exceptionally(ex -> {
    System.out.println("处理异常: " + ex.getMessage());
    return "Fallback";
}).thenAccept(System.out::println);

CompletableFuture通过函数式编程范式将多线程开发提升到了新高度,合理运用可大幅提升系统并发性能和代码可维护性。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

值引力

持续创作,多谢支持!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值