当前位置: 首页 > news >正文

推荐使用 CompletableFuture 框架进行异步操作,很强很方便

文章目录

    • 1. 基础概念
    • 2. 创建 CompletableFuture
      • 2.1 异步执行无返回值的任务
      • 2.2 异步执行有返回值的任务
    • 3. 组合 CompletableFuture
      • 3.1 顺序组合
      • 3.2 并行组合
    • 4. 异常处理
    • 5. 等待异步操作完成
    • 6. 取消异步操作
    • 7. 处理多个 CompletableFuture
    • 8. 实际应用示例
    • 结论
    • 推荐阅读文章

在Java 8及更高版本中, CompletableFuture 提供了一种强大的方式来处理异步编程。它不仅简化了回调,还提供了丰富的API来组合异步操作、处理异常和控制流程。下面介绍几个 CompletableFuture 框架中最常用的几个方法:

1. 基础概念

CompletableFuture 是一个可以异步完成操作的类,它提供了一个可写的 Future。这意味着你可以从异步计算中主动完成结果,或者在计算完成时被动接收结果。

2. 创建 CompletableFuture

2.1 异步执行无返回值的任务

CompletableFuture<Void> future = CompletableFuture.runAsync(() -> {// 执行异步任务
});

2.2 异步执行有返回值的任务

CompletableFuture<String> future = CompletableFuture.supplyAsync(() -> {// 执行异步任务并返回结果return "Hello, CompletableFuture!";
});

3. 组合 CompletableFuture

3.1 顺序组合

使用 thenApply 方法来顺序组合异步操作,它接收一个函数,该函数会在前一个 CompletableFuture 完成后被调用。

CompletableFuture<String> future = CompletableFuture.supplyAsync(() -> "Hello").thenApplyAsync(s -> s + ", CompletableFuture!");

3.2 并行组合

使用 thenCombine 方法来并行组合异步操作,它接收另一个 CompletableFuture 和一个双函数,该函数会在两个 CompletableFuture 都完成后被调用。

CompletableFuture<String> future1 = CompletableFuture.supplyAsync(() -> "Hello");
CompletableFuture<Integer> future2 = CompletableFuture.supplyAsync(() -> 5);
CompletableFuture<String> combined = future1.thenCombine(future2, (s, i) -> s + i);

4. 异常处理

exceptionally 方法可以用来处理 CompletableFuture 中发生的异常。

CompletableFuture<String> future = CompletableFuture.supplyAsync(() -> {throw new RuntimeException("Error!");
}).exceptionally(ex -> {// 处理异常return "Default Value";
});

5. 等待异步操作完成

join 方法可以用来阻塞当前线程直到 CompletableFuture 完成。

String result = future.join(); // 阻塞直到 future 完成

6. 取消异步操作

CompletableFuture 支持取消异步操作。

CompletableFuture<Void> future = CompletableFuture.runAsync(() -> {// 长时间运行的任务
});
future.cancel(true); // 取消任务

7. 处理多个 CompletableFuture

CompletableFuture 提供了 allOf 方法来等待多个异步操作完成。

CompletableFuture<String> future1 = CompletableFuture.supplyAsync(() -> "Hello");
CompletableFuture<Integer> future2 = CompletableFuture.supplyAsync(() -> 5);
CompletableFuture<Void> allFutures = CompletableFuture.allOf(future1, future2);
allFutures.join(); // 等待所有 future 完成

8. 实际应用示例

假设我们需要从两个不同的服务中获取数据,并将结果合并。

CompletableFuture<String> data1 = CompletableFuture.supplyAsync(() -> fetchDataFromService1());
CompletableFuture<String> data2 = CompletableFuture.supplyAsync(() -> fetchDataFromService2());
CompletableFuture<String> combinedData = data1.thenCombine(data2, (s1, s2) -> s1 + " " + s2);
String result = combinedData.join();

结论

CompletableFuture 是Java异步编程的强大工具,它提供了一种简洁且强大的方式来处理异步任务。通过本文的介绍,你应该能够开始在你的项目中使用 CompletableFuture 来简化异步代码,并提高程序的响应性和性能。
不过你得注意异步的时候,上下文无法传递的问题哦。这个你可以通过自定义线程池来解决!

推荐阅读文章

  • 由 Spring 静态注入引发的一个线上T0级别事故(真的以后得避坑)

  • 如何理解 HTTP 是无状态的,以及它与 Cookie 和 Session 之间的联系

  • HTTP、HTTPS、Cookie 和 Session 之间的关系

  • 什么是 Cookie?简单介绍与使用方法

  • 什么是 Session?如何应用?

  • 使用 Spring 框架构建 MVC 应用程序:初学者教程

  • 有缺陷的 Java 代码:Java 开发人员最常犯的 10 大错误

  • 如何理解应用 Java 多线程与并发编程?

  • 把握Java泛型的艺术:协变、逆变与不可变性一网打尽

  • Java Spring 中常用的 @PostConstruct 注解使用总结

  • 如何理解线程安全这个概念?

  • 理解 Java 桥接方法

  • Spring 整合嵌入式 Tomcat 容器

  • Tomcat 如何加载 SpringMVC 组件

  • “在什么情况下类需要实现 Serializable,什么情况下又不需要(一)?”

  • “避免序列化灾难:掌握实现 Serializable 的真相!(二)”

  • 如何自定义一个自己的 Spring Boot Starter 组件(从入门到实践)

  • 解密 Redis:如何通过 IO 多路复用征服高并发挑战!

  • 线程 vs 虚拟线程:深入理解及区别

  • 深度解读 JDK 8、JDK 11、JDK 17 和 JDK 21 的区别

  • 10大程序员提升代码优雅度的必杀技,瞬间让你成为团队宠儿!

  • “打破重复代码的魔咒:使用 Function 接口在 Java 8 中实现优雅重构!”

  • Java 中消除 If-else 技巧总结

  • 线程池的核心参数配置(仅供参考)

  • 【人工智能】聊聊Transformer,深度学习的一股清流(13)

  • Java 枚举的几个常用技巧,你可以试着用用


http://www.mrgr.cn/news/62189.html

相关文章:

  • 开源一款基于 JAVA 的仓库管理系统,支持三方物流和厂内物流,包含 PDA 和 WEB 端的源码
  • JDK高性能套路: 自旋(for(;;)) + CAS
  • CSS 复习
  • [极客大挑战 2019]FinalSQL
  • Hi5 2.0 VR手套代码解释
  • 【LeetCode】两数之和、大数相加
  • 从一到无穷大 #38:讨论 “Bazel 集成仅使用 Cmake 的依赖项目” 通用方法
  • 智航船舶租赁综合管理系统
  • 【C++刷题】力扣-#575-分糖果
  • python的lambda实用技巧
  • 深度学习之激活函数
  • 避免关键任务延迟的资源分配方法
  • Golang高级语法-工具链
  • 拓展学习-golang的基础语法和常用开发工具
  • 博科交换机SNMP采集(光衰)信息
  • 【FinalShell问题】FinalShell连接虚拟机超时问题
  • 「Mac畅玩鸿蒙与硬件14」鸿蒙UI组件篇4 - Toggle 和 Checkbox 组件
  • RegCM模式运行./bin/regcmMPI报错
  • 函数声明不是原型error: function declaration isn’t a prototype
  • 爆肝整理14天AI工具宝藏合集(三)
  • Node.js:模块 包
  • 前端文件上传组件流程的封装
  • React 组件生命周期与 Hooks 简明指南
  • python pytest-mock插件
  • Redis 事务 总结
  • 设计模式——外观模式