一、CompletableFuture 到底是什么一句话它是 Java 用来做异步任务编排的工具。它能让你轻松实现异步执行不阻塞主线程串行执行A 做完做 B并行执行A、B 同时做AND 汇聚都做完再执行OR 汇聚一个做完就执行异常统一处理超时控制它 异步任务的总指挥二、核心两种创建异步任务的方式有无返回值1.runAsync () → 无返回值RunnableCompletableFutureVoid future CompletableFuture.runAsync(() - { // 任务洗水壶、烧开水、发日志、发消息 });2.supplyAsync () → 有返回值SupplierCompletableFutureString future CompletableFuture.supplyAsync(() - { // 任务查数据库、查接口、计算、拿茶叶 return 结果; });三、必须记住线程池问题生产最重要默认线程池 危险禁止用// 危险默认用 ForkJoinPool线程数CPU核心数 supplyAsync(()-{}); // 正确必须用自定义线程池 supplyAsync(()-{}, 自定义线程池);原因一个慢任务会拖垮整个系统四、四种任务关系核心中的核心1. 串行关系上一步做完再做下一步thenApply / thenAccept / thenRun / thenCompose① thenApply有入有出数据转换future.thenApply(result - { return 处理后 result; });② thenAccept有入无出消费结果future.thenAccept(result - { System.out.println(result); });③ thenRun无入无出最后收尾future.thenRun(() - { System.out.println(任务结束); });④ thenCompose串两个异步任务最常用future.thenCompose(result - { // 返回新异步任务 return anotherFuture(); });2. AND 汇聚关系所有任务完成才执行都做完 → 再执行① thenCombine合并两个结果future1.thenCombine(future2, (r1, r2) - { return r1 r2; });② allOf等待 N 个任务全部完成CompletableFuture.allOf(f1, f2, f3).join();典型场景并行查用户、订单、优惠券3. OR 汇聚关系任意一个完成就执行谁快谁执行① applyToEitherfuture1.applyToEither(future2, result - { return result; });② anyOfCompletableFuture.anyOf(f1, f2, f3);典型场景超时降级、主备切换4. 异常处理① exceptionally捕获异常返回默认值future.exceptionally(ex - { return 默认值; });② whenComplete无论成功失败都进入future.whenComplete((r, ex) - { // 处理结果或异常 });③ handle异常 结果都处理future.handle((r, ex) - { return r; });五、超时控制高可用必备future.orTimeout(3, TimeUnit.SECONDS); // 3秒超时六、获取结果// 阻塞等待不抛受检异常 future.join(); // 阻塞等待抛受检异常 future.get(); // 带超时 future.get(3, TimeUnit.SECONDS);七、真实业务流程最标准的示范// 1. 异步创建订单 orderService.createAsync(userId) // 2. 串异步扣库存 .thenCompose(orderId - stockService.deductAsync(orderId)) // 3. 数据转换 .thenApply(success - 结果: success) // 4. 日志 .thenAccept(log::info) // 5. 异常处理 .exceptionally(ex - { log.error(失败, ex); return 异常; });
CompletableFuture 详细讲解
发布时间:2026/6/10 23:40:20
一、CompletableFuture 到底是什么一句话它是 Java 用来做异步任务编排的工具。它能让你轻松实现异步执行不阻塞主线程串行执行A 做完做 B并行执行A、B 同时做AND 汇聚都做完再执行OR 汇聚一个做完就执行异常统一处理超时控制它 异步任务的总指挥二、核心两种创建异步任务的方式有无返回值1.runAsync () → 无返回值RunnableCompletableFutureVoid future CompletableFuture.runAsync(() - { // 任务洗水壶、烧开水、发日志、发消息 });2.supplyAsync () → 有返回值SupplierCompletableFutureString future CompletableFuture.supplyAsync(() - { // 任务查数据库、查接口、计算、拿茶叶 return 结果; });三、必须记住线程池问题生产最重要默认线程池 危险禁止用// 危险默认用 ForkJoinPool线程数CPU核心数 supplyAsync(()-{}); // 正确必须用自定义线程池 supplyAsync(()-{}, 自定义线程池);原因一个慢任务会拖垮整个系统四、四种任务关系核心中的核心1. 串行关系上一步做完再做下一步thenApply / thenAccept / thenRun / thenCompose① thenApply有入有出数据转换future.thenApply(result - { return 处理后 result; });② thenAccept有入无出消费结果future.thenAccept(result - { System.out.println(result); });③ thenRun无入无出最后收尾future.thenRun(() - { System.out.println(任务结束); });④ thenCompose串两个异步任务最常用future.thenCompose(result - { // 返回新异步任务 return anotherFuture(); });2. AND 汇聚关系所有任务完成才执行都做完 → 再执行① thenCombine合并两个结果future1.thenCombine(future2, (r1, r2) - { return r1 r2; });② allOf等待 N 个任务全部完成CompletableFuture.allOf(f1, f2, f3).join();典型场景并行查用户、订单、优惠券3. OR 汇聚关系任意一个完成就执行谁快谁执行① applyToEitherfuture1.applyToEither(future2, result - { return result; });② anyOfCompletableFuture.anyOf(f1, f2, f3);典型场景超时降级、主备切换4. 异常处理① exceptionally捕获异常返回默认值future.exceptionally(ex - { return 默认值; });② whenComplete无论成功失败都进入future.whenComplete((r, ex) - { // 处理结果或异常 });③ handle异常 结果都处理future.handle((r, ex) - { return r; });五、超时控制高可用必备future.orTimeout(3, TimeUnit.SECONDS); // 3秒超时六、获取结果// 阻塞等待不抛受检异常 future.join(); // 阻塞等待抛受检异常 future.get(); // 带超时 future.get(3, TimeUnit.SECONDS);七、真实业务流程最标准的示范// 1. 异步创建订单 orderService.createAsync(userId) // 2. 串异步扣库存 .thenCompose(orderId - stockService.deductAsync(orderId)) // 3. 数据转换 .thenApply(success - 结果: success) // 4. 日志 .thenAccept(log::info) // 5. 异常处理 .exceptionally(ex - { log.error(失败, ex); return 异常; });