本周我学习了:CompletableFuture – Java 的异步编程方法

本周我学习了:completablefuture – java 的异步编程方法

本周,我将深入研究 java 的 completablefuture。

作为一名有前端背景的全栈开发者,处理异步任务是我角色中不可避免的一部分——网络请求、后台计算等。在 java 中,completablefuture 是一个强大的工具,用于处理这些任务,同时保持主线程响应。

completable futures 之于 java 就像 promises 之于 javascript。

如果您熟悉 javascript,通过比较两种语言可能有助于掌握这些概念。我喜欢将 completablefuture 视为 java 版本的 promise。它是一个表示异步操作的最终结果的类,无论该结果是成功还是失败。它作为 java.util.concurrent 包的一部分在 java 8 中引入,是一种编写非阻塞代码的强大方法,具有链接操作和处理错误的方法,与 promises 类似。

这是两者的快速比较:

// javascript promisefetchfromserver()    .then(data => processdata(data))    .then(result => updateui(result))    .catch(error => handleerror(error));
// java completablefuturecompletablefuture.supplyasync(() -> fetchdatafromserver())    .thenapply(data -> processdata(data))    .thenaccept(result -> updateui(result))    .exceptionally(error -> handleerror(error));

如上所示,completablefuture 提供了类似的可链接语法,允许干净且可读的异步代码。

立即学习“Java免费学习笔记(深入)”;

考虑一个场景,您需要从两个单独的端点获取用户的个人资料数据和订单历史记录。您可能希望避免在等待这些请求完成时冻结 ui。以下是使用 completablefuture 实现此功能的方法:

豆包AI编程 豆包AI编程

豆包推出的AI编程助手

豆包AI编程 483 查看详情 豆包AI编程

completablefuture profilefuture = completablefuture.supplyasync(() -> {    // fetch user profile from a service});completablefuture<list> ordersfuture = completablefuture.supplyasync(() -> {    // fetch user orders from another service});completablefuture combinedfuture = completablefuture.allof(profilefuture, ordersfuture);combinedfuture.thenrun(() -> {    user user = userfuture.join();     list orders = ordersfuture.join();     displayuserdata(user, orders); });

在这个例子中,我们同时触发两个异步请求,并使用 allof 等待两个请求完成。一旦完成,我们就会检索结果并相应地更新 ui,所有这些都不会阻塞主线程。

链接和完成阶段

completablefuture 实现了 completionstage 接口,为链式操作提供了基础。每个 thenapply、thenaccept 和类似方法都会返回另一个 completionstage,允许您创建复杂的异步管道。

类似于当我们有一系列要依次执行的异步任务时,我们如何在 javascript 中链接 promise,我们可以在 completable future 中链接任务,以便创建一系列依赖的异步操作,而不会陷入回调地狱。我们将这样做:

completablefuture.supplyasync(() -> "hello")    .thenapply(result -> result + ", completablefuture")    .thenapply(result -> result + " in java")    .thenaccept(system.out::println);

处理异常

当我们在 promise 对象上使用 .catch() 时,我们在 completable future 上使用 .exceptionally() 。该方法处理异步处理过程中可能出现的异常:

CompletableFuture.supplyAsync(() -> {    if (true) {        throw new RuntimeException("Exception in CompletableFuture!");    }    return "No exception";}).exceptionally(ex -> {    System.out.println("Handled exception: " + ex);    return "Recovered value";}).thenAccept(System.out::println);

我希望这篇文章能为您提供一个很好的起点来进一步探索 completablefuture 类。

有用链接:

并发深入探讨:completablefuture 指南java 异步编程综合介绍 – promise、callbacks 和 futures

以上就是本周我学习了:CompletableFuture – Java 的异步编程方法的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/502791.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年11月8日 21:06:01
电脑磁盘数据丢失怎么找回 电脑磁盘数据丢失怎么恢复
下一篇 2025年11月8日 21:06:04

相关推荐

  • C++STL容器与智能指针结合使用

    智能指针与STL容器结合主要用于自动管理动态对象的生命周期,常见场景包括:1. 使用std::vector管理独占所有权的对象集合,避免内存泄漏;2. 在树或图等复杂数据结构中,用std::shared_ptr实现共享节点,简化内存管理;3. 多线程环境下通过std::shared_ptr安全共享资…

    2025年12月18日
    000
  • C++数组初始化列表使用技巧

    C++数组初始化列表可提升代码安全与可读性。1. 省略大小时由编译器自动推导;2. 部分初始化时剩余元素补0;3. 用{0}快捷清零整个数组;4. C++11推荐使用{}统一初始化避免解析歧义;5. 多维数组可通过嵌套列表清晰初始化,缺省项自动补0。优先采用统一初始化风格以增强代码一致性。 在C++…

    2025年12月18日
    200
  • C++如何优化递归函数性能

    优化C++递归性能的核心方法包括:使用记忆化或动态规划减少重复计算,将递归转换为迭代以消除函数调用开销和栈溢出风险,利用尾递归优化(依赖编译器支持),以及重新评估算法设计。其中,记忆化通过缓存子问题结果提升效率,动态规划采用自底向上迭代避免递归开销,尾递归在特定条件下可被编译器优化为循环,而彻底转为…

    2025年12月18日
    100
  • C++如何使用指针访问联合体成员

    使用指针访问联合体成员与结构体语法相同,但联合体内存共享,需注意未定义行为。1. 联合体所有成员共享同一内存地址,任一成员赋值会覆盖其他成员;2. 通过指针用->操作符访问成员,语法与结构体一致;3. 读取非最后写入的成员导致未定义行为;4. 可通过判别器字段或封装类提升类型安全;5. C++…

    2025年12月18日
    000
  • C++STL查找算法find和binary_search使用

    std::find适用于无序数据的线性查找,返回元素位置,时间复杂度O(N);std::binary_search要求数据有序,仅判断存在性,时间复杂度O(log N),效率更高。 在C++ STL中, std::find 和 std::binary_search 是两种核心的查找算法,它们各自适用…

    2025年12月18日
    100
  • C++内存模型基本概念解析

    C++内存模型是标准对多线程内存访问行为的规范,解决了因编译器优化、CPU乱序执行和缓存导致的程序行为不一致问题。它通过原子操作和内存顺序(如memory_order_acquire/release)协同工作,确保共享变量访问的正确性与可移植性。原子操作保证读写不可分割,内存顺序定义操作间的happ…

    2025年12月18日
    200
  • C++11多线程同步std::mutex和std::lock_guard使用

    std::mutex与std::lock_guard配合使用可安全实现线程同步,前者提供锁机制,后者通过RAII确保异常安全的自动加解锁。 在C++11中,多线程编程变得更加方便和安全,其中 std::mutex 和 std::lock_guard 是实现线程同步的两个核心工具。它们配合使用可以有效…

    2025年12月18日
    100
  • C++模板与STL容器结合使用方法

    模板与STL容器结合可实现泛型编程,提升代码复用性;2. 可编写模板函数操作任意STL容器,如通用打印函数;3. 类模板可包含STL容器成员,适配多种数据类型;4. 模板可与map等关联容器结合,实现如计数功能;5. 需注意类型操作支持、运算符重载及避免硬编码容器类型。 在C++中,模板与STL容器…

    2025年12月18日
    200
  • c++中如何查找子字符串_C++ string查找子串(find)方法详解

    答案:std::string的find()方法用于查找子串首次出现位置,返回索引或npos;支持从指定位置开始查找,常用于定位字符串中目标子串,结合循环可查找所有匹配项。 在C++中,std::string 提供了多种方法来查找子字符串,其中最常用的是 find() 方法。它能帮助我们在一个字符串中…

    2025年12月18日
    000
  • C++20的指定初始化(designated initializers)如何用于结构体

    C++20指定初始化器通过成员名赋值提升可读性与健壮性,必须按声明顺序使用,适用于聚合类型,避免混合初始化以减少复杂性。 C++20的指定初始化器(designated initializers)为结构体成员的初始化提供了一种更清晰、更安全的方式。简单来说,它允许你通过成员的名称来赋值,而不是仅仅依…

    2025年12月18日
    000
  • C++如何实现中介者模式解耦对象

    中介者模式通过引入中介者对象管理交互,降低C++中类间的耦合度。定义Mediator接口规范通信方法,同事类持有中介者指针并通过其转发消息,避免直接引用其他同事。具体中介者维护同事列表,根据业务逻辑转发消息,实现集中控制。示例代码展示同事类通过中介者发送和接收消息的过程,提升系统可维护性和扩展性。 …

    2025年12月18日
    000
  • C++如何避免智能指针内存泄漏

    正确使用智能指针可避免内存泄漏,关键在于理解机制并规避陷阱。1. 用 weak_ptr 打破 shared_ptr 的循环引用;2. 优先使用 make_shared 和 make_unique 初始化,禁止裸指针重复构造智能指针;3. 需传递 this 时继承 enable_shared_from…

    2025年12月18日
    000
  • c++如何读写二进制文件_c++二进制文件I/O操作方法

    C++通过fstream类以ios::binary模式进行二进制文件读写,使用read()和write()函数直接操作内存数据,避免文本转换开销;需正确打开关闭文件,使用reinterpret_cast处理指针类型转换,并可通过批量读写、缓冲区优化及减少文件操作频次提升性能。 C++读写二进制文件,…

    2025年12月18日
    000
  • C++如何使用STL实现高效查找和排序

    STL中适合高效查找的容器有std::unordered_map、std::unordered_set、std::map、std::set和排序后的std::vector。其中std::unordered_map和std::unordered_set基于哈希表,平均查找时间复杂度为O(1),适用于对…

    2025年12月18日
    000
  • C++throw关键字使用方法解析

    throw关键字用于抛出异常,如除零时抛出std::runtime_error,由try-catch捕获处理,应在无效输入、资源失败等错误时使用,并合理处理性能开销。 C++ 中的 throw 关键字用于抛出异常。 当程序遇到无法处理的错误或异常情况时,可以使用 throw 抛出一个异常对象,然后由…

    2025年12月18日
    000
  • 如何在C++中处理异常_C++异常处理机制详解

    C++异常机制通过try-catch结构分离错误检测与处理,结合RAII确保异常发生时资源能自动释放,适用于处理构造失败、资源获取失败等不可恢复错误,应避免用于常规控制流,且需注意性能开销主要在异常抛出时的栈展开,设计上需遵循异常安全级别与层次化异常类体系。 在C++中,处理程序运行时可能遇到的非预…

    2025年12月18日
    000
  • C++数组元素访问与边界检查

    数组通过下标访问元素,如int arr[5] = {10, 20, 7, 8, 25}; cout 在C++中,数组是一种基础且常用的数据结构,用于存储相同类型的连续数据。访问数组元素通常通过下标操作符 [] 实现,但C++标准并不强制进行边界检查,这既提供了性能优势,也带来了潜在风险。 数组元素的…

    2025年12月18日
    000
  • C++如何为项目配置调试环境

    配置C++调试环境需生成调试符号并正确设置IDE或调试器。首先编译时添加-g(GCC/Clang)或/Zi(MSVC)以生成调试信息,使用CMake时设CMAKE_BUILD_TYPE为Debug;其次在IDE中配置可执行文件路径、工作目录、命令行参数、环境变量及调试器类型(如GDB、LLDB),V…

    2025年12月18日
    000
  • c++中如何使用正则表达式_C++正则表达式(regex)库使用教程

    C++中使用正则需包含头文件,支持匹配、搜索、替换和分组提取。1. regex_match判断完全匹配;2. regex_search查找子串;3. smatch保存结果并提取分组;4. regex_replace替换文本;5. 复用regex对象提升性能,注意异常处理。 在C++中使用正则表达式需…

    2025年12月18日
    000
  • C++智能指针异常抛出处理方法

    智能指针在异常安全中需注意资源管理,应优先使用make_shared/make_unique避免裸指针暴露,确保对象创建即交由智能指针管理,防止因异常导致内存泄漏。 在使用C++智能指针时,异常安全是必须考虑的问题。虽然智能指针本身的设计有助于防止内存泄漏,但在异常抛出的场景下,仍需注意资源管理和对…

    2025年12月18日
    000

发表回复

登录后才能评论
关注微信