【并发编程系列】使用 CompletableFuture 实现并发任务处理

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。
img

  • 推荐:kwan 的首页,持续学习,不断总结,共同进步,活到老学到老
  • 导航
    • 檀越剑指大厂系列:全面总结 java 核心技术点,如集合,jvm,并发编程 redis,kafka,Spring,微服务,Netty 等
    • 常用开发工具系列:罗列常用的开发工具,如 IDEA,Mac,Alfred,electerm,Git,typora,apifox 等
    • 数据库系列:详细总结了常用数据库 mysql 技术点,以及工作中遇到的 mysql 问题等
    • 懒人运维系列:总结好用的命令,解放双手不香吗?能用一个命令完成绝不用两个操作
    • 数据结构与算法系列:总结数据结构和算法,不同类型针对性训练,提升编程思维,剑指大厂

非常期待和您一起在这个小小的网络世界里共同探索、学习和成长。💝💝💝 ✨✨ 欢迎订阅本专栏 ✨✨

博客目录

    • 引言
    • CompletableFuture 简介
    • 示例代码解析
    • 异常处理
    • 结果保存
    • 总结

摘要:本文介绍了使用 CompletableFuture 类在 Java 中实现并发任务处理的方法。通过一个示例代码,详细解释了如何使用 CompletableFuture 创建多个异步任务,并在所有任务完成后处理它们的返回结果。

image-20240403234624165


引言

在并发编程中,任务的并行执行是提高应用程序性能和响应能力的关键。Java 提供了 CompletableFuture 类,它是 Java 8 引入的一种用于异步编程的工具。CompletableFuture 类提供了一种简单而强大的方式来处理并发任务,并充分利用了多核处理器的能力。本文将介绍如何使用 CompletableFuture 类来实现并发任务处理,并通过一个示例代码进行演示。

CompletableFuture 简介

CompletableFuture 是 Java 中的一个类,它实现了 Future 接口,并提供了额外的方法来处理异步任务的结果。与传统的 Future 对象不同,CompletableFuture 可以利用回调函数和组合操作来处理任务的结果,从而实现更加灵活和高效的并发编程。

示例代码解析

下面是一段使用 CompletableFuture 实现并发任务处理的示例代码:

List<CompletableFuture<UserMessage>> futures = new ArrayList<>();
for (int i = 0; i < 1; i++) {CompletableFuture<UserMessage> future = CompletableFuture.supplyAsync(() -> this.submitAnswerByTitle(id, title));futures.add(future);
}
CompletableFuture.allOf(futures.toArray(new CompletableFuture[0])).thenAccept(v -> {for (CompletableFuture<UserMessage> future : futures) {try {UserMessage userMessage = future.get();// 处理任务的返回结果// ...} catch (InterruptedException | ExecutionException e) {// 处理异常// ...}}}).join();

以上代码展示了如何使用 CompletableFuture 创建多个异步任务,并在所有任务完成后处理它们的返回结果。首先,我们创建了一个空的 CompletableFuture 列表futures,然后使用CompletableFuture.supplyAsync()方法创建一个异步任务,并将其添加到列表中。在本例中,我们只创建了一个任务,但您可以根据需要创建更多的任务。

接下来,我们使用CompletableFuture.allOf()方法将所有任务组合在一起,并在它们都完成后执行后续操作。CompletableFuture.allOf()方法接受一个 CompletableFuture 数组作为参数,并返回一个新的 CompletableFuture,它在所有任务都完成时完成。我们使用thenAccept()方法来定义任务完成后的操作,其中我们遍历每个任务并处理其返回结果。

在示例代码中,我们使用future.get()方法获取任务的返回结果,并在相关代码位置进行处理。您可以根据具体需求对返回结果进行进一步的操作,比如保存到数据库、发送到消息队列等。此外,我们还捕获了可能发生的 InterruptedException 和 ExecutionException 异常,并进行相应的处理。

异常处理

在并发任务处理中,异常处理是一个重要的方面。CompletableFuture 提供了多种方法来处理异常情况,例如exceptionally()handle()whenComplete()等。在示例代码中,我们使用了catch块来捕获异常并进行处理,但您也可以使用 CompletableFuture 提供的异常处理方法来处理异常情况。

例如,如果您希望为每个任务定义特定的异常处理逻辑,可以使用exceptionally()方法。它允许您为每个任务定义一个回调函数,该函数在任务发生异常时被调用,并返回一个默认值或执行其他操作。这样,即使其中一个任务失败,也不会影响其他任务的执行。

结果保存

在示例代码中,我们展示了如何处理任务的返回结果,并根据需要执行相应的操作。在实际应用中,您可能需要将结果保存到数据库、写入文件或通过网络发送等。根据具体需求,您可以在thenAccept()方法中添加更多的逻辑来实现结果的保存。

例如,在示例代码中,我们创建了一个Info对象,将返回结果中的数据设置到对象中,并调用save()方法将Info对象保存到适当的位置。这里的保存逻辑是一个示例,您可以根据实际需求进行修改和扩展。

image-20240403234634719

总结

通过本文,我们介绍了如何使用 CompletableFuture 类在 Java 中实现并发任务处理。我们解释了 CompletableFuture 的基本概念,并通过一个示例代码详细演示了如何创建多个异步任务,并在所有任务完成后处理它们的返回结果。我们还讨论了异常处理和结果保存的相关问题。使用 CompletableFuture 可以轻松地管理和处理并发任务,提高应用程序的性能和响应能力。

通过合理地利用并发编程的能力,我们可以更好地优化应用程序的性能,并提供更好的用户体验。掌握并发编程的技巧和工具,对于 Java 开发人员来说是非常重要的。CompletableFuture 作为 Java 中强大的异步编程工具之一,为我们提供了一种简单而灵活的方式来处理并发任务。

希望本文对您理解 CompletableFuture 的使用和并发任务处理有所帮助。通过合理地应用并发编程的技术,您可以构建高效、可扩展的应用程序,并提供卓越的用户体验。感谢您的阅读!

觉得有用的话点个赞 👍🏻 呗。
❤️❤️❤️本人水平有限,如有纰漏,欢迎各位大佬评论批评指正!😄😄😄

💘💘💘如果觉得这篇文对你有帮助的话,也请给个点赞、收藏下吧,非常感谢!👍 👍 👍

🔥🔥🔥Stay Hungry Stay Foolish 道阻且长,行则将至,让我们一起加油吧!🌙🌙🌙

img

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/791137.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Autodesk AutoCAD 2025 (macOS, Windows) - 自动计算机辅助设计软件

Autodesk AutoCAD 2025 (macOS, Windows) - 自动计算机辅助设计软件 AutoCAD 2024 开始原生支持 Apple Silicon&#xff0c;性能提升至 2 倍 请访问原文链接&#xff1a;https://sysin.org/blog/autodesk-autocad/&#xff0c;查看最新版。原创作品&#xff0c;转载请保留出处…

Golang | Leetcode Golang题解之第8题字符串转换整数atoi

题目&#xff1a; 题解&#xff1a; func myAtoi(s string) int {abs, sign, i, n : 0, 1, 0, len(s)//丢弃无用的前导空格for i < n && s[i] {i}//标记正负号if i < n {if s[i] - {sign -1i} else if s[i] {sign 1i}}for i < n && s[i] >…

SQL Server 存储过程:BBS论坛(表结构文档下载及30个存储过程)

基于 Asp.Net 和 SQL Server 实现了一个BBS论坛&#xff0c;论坛功能比较强大&#xff0c;论坛大部分业务逻辑基于存储过程实现&#xff0c;记录一下。 BBS论坛存储过程清单 序号存储过程功能说明1sp_bbs_admin_add添加管理员2sp_bbs_admin_del删除系统管理员3sp_bbs_admin_m…

Spark-Scala语言实战(9)

之前的文章中&#xff0c;我们学习了如何在spark中使用RDD方法的flatMap,take,union。想了解的朋友可以查看这篇文章。同时&#xff0c;希望我的文章能帮助到你&#xff0c;如果觉得我的文章写的不错&#xff0c;请留下你宝贵的点赞&#xff0c;谢谢。 Spark-Scala语言实战&am…

【ESP32S3 Sense接入语音识别+MiniMax模型+TTS模块语音播报】

【ESP32S3 Sense接入语音识别MiniMax模型TTS模块语音播报】 1. 前言2. 功能模块概述2.1 语音接入2.2 大模型接入2.3 TTS模块接入 3. 先决条件3.1 环境配置3.2 所需零件3.3 硬件连接步骤 4. 核心代码4.1 源码分享4.2 代码解析 5. 上传验证5.1 对话测试5.2 报错 6. 总结 1. 前言 …

C语言杂谈

努力扩大自己&#xff0c;以靠近&#xff0c;以触及自身以外的世界 文章目录 什么是定义&#xff1f;什么是声明&#xff1f;什么是赋值&#xff1f;什么是初始化&#xff1f;什么是生命周期&#xff1f;什么是作用域&#xff1f;全局变量&#xff1f;局部变量&#xff1f;size…

HCIA-RS基础-VLAN路由

目录 VLAN 路由1. 什么是 VLAN 路由2. VLAN 路由的原理及配置3. VLAN 的缺点和 VLAN Trunking4. 单臂路由配置 总结 VLAN 路由 1. 什么是 VLAN 路由 VLAN 路由是指在虚拟局域网&#xff08;VLAN&#xff09;之间进行路由转发的过程。传统的 VLAN 配置只能在同一个 VLAN 内进行…

简单认识 node 包的幽灵依赖

幽灵依赖的概念与成因 在 Node.js 的包管理生态系统中&#xff0c;特别是使用 npm&#xff08;Node Package Manager&#xff09;作为包管理器时&#xff0c;“幽灵依赖”是指那些没有直接在项目的 dependencies 或 devDependencies 中显式声明&#xff0c;但却能够在项目的依…

LCD1602显示屏

LCD1602显示 概述 LCD1602&#xff08;Liquid Crystal Display&#xff09;是一种工业字符型液晶&#xff0c;能够同时显示 1602 即 32 字符(16列两行) 引脚说明 //电源 VSS -- GND VDD -- 5V //对比度 VO -- GND //控制线 RS -- P1.0 RW -- P1.1 E -- P1.4 //背光灯 A -- 5…

LLaMA-Factory+qwen多轮对话微调

LLaMA-Factory地址&#xff1a;https://github.com/hiyouga/LLaMA-Factory/blob/main/README_zh.md qwen地址&#xff1a;https://huggingface.co/Qwen/Qwen-7B-Chat/tree/main 数据准备 数据样例 [ {"id": "x3959", "conversations": [{&qu…

2024年150道高频Java面试题(十六)

31. Java 8 中引入的 Stream API 有哪些用途&#xff1f; Java 8 中引入的 Stream API 是一个强大的新特性&#xff0c;它提供了一种高效且易于使用的处理数据的方法。Stream API 的用途主要包括以下几个方面&#xff1a; 简化集合操作&#xff1a;Stream API 可以对集合对象…

在ChatGPT中,能用DALL·E 3编辑图片啦!

4月3日&#xff0c;OpenAI开始向部分用户&#xff0c;提供在ChatGPT中的DALLE 3图片编辑功能。 DALLE 3是OpenAI在2023年9月20日发布的一款文生图模型&#xff0c;其生成的图片效果可以与Midjourney、leonardo、ideogram等顶级产品媲美&#xff0c;随后被融合到ChatGPT中增强其…

matlab的歧视:simulink不能使用stm32f4系列的ADC?

2023b的matlab&#xff0c;stm32f407芯片&#xff0c;运行内容Using the Analog to Digital Converter Block to Support STMicroelectronics STM32 Processor Based Boards Using the Analog to Digital Converter Block to Support STMicroelectronics STM32 Processor Base…

基于SSM的社区疫情防控管理信息系统

目录 背景 技术简介 系统简介 界面预览 背景 随着时代的进步&#xff0c;计算机技术已经全方位地影响了社会的发展。随着居民生活质量的持续上升&#xff0c;人们对社区疫情防控管理信息系统的期望和要求也在同步增长。在社区疫情防控日益受到广泛关注的背景下&#xff0c…

【漏洞复现】通天星CMSV6车载主动安全监控云平台inspect_file接口处存在任意文件上传漏洞

免责声明&#xff1a;文章来源互联网收集整理&#xff0c;请勿利用文章内的相关技术从事非法测试&#xff0c;由于传播、利用此文所提供的信息或者工具而造成的任何直接或者间接的后果及损失&#xff0c;均由使用者本人负责&#xff0c;所产生的一切不良后果与文章作者无关。该…

电商技术揭秘一:电商架构设计与核心技术

文章目录 引言一、电商平台架构概述1.1 架构设计原则与架构类型选择1.2 传统电商平台架构与现代化架构趋势分析 二、高并发处理与负载均衡2.1 高并发访问特点分析与挑战2.2 负载均衡原理与算法选择 三、分布式数据库与缓存技术3.1 分布式数据库设计与一致性考量3.2 缓存策略与缓…

第四十二章 保护与 IRIS 的 Web 网关连接 - Windows

文章目录 第四十二章 保护与 IRIS 的 Web 网关连接 - WindowsKerberos 的 Windows Web 网关配置 Kerberos 的 UNIX Web 网关配置Kerberos 的 UNIX Web 网关配置基于 SSL/TLS 的身份验证和数据保护 第四十二章 保护与 IRIS 的 Web 网关连接 - Windows Kerberos 密钥表未针对 Wi…

Vue登陆鉴权方案(token)

Vue token 登陆鉴权完整方案-----总结 一、路由拦截 目的&#xff1a;页面跳转时验证&#xff0c;确认是否即将进入的页面需要登陆验证。 router/index.js //给需要验证的页面添加 meta : { requireAuth :true } 如下&#xff1a; export default new Router({scrollBehavior…

基于SpringBoot和Vue的金融融资管理系统的设计和实现【附源码】

1、系统演示视频&#xff08;演示视频&#xff09; 2、需要交流和学习请联系

vue弹出的添加信息组件中 el-radio 单选框无法点击问题

情景描述:在弹出的添加信息的组件中的form中有一个单选框,单选框无法进行点击切换 原因如下: 单选框要求有个默认值,因为添加和更新操作复用同一个组件,所以我在初始化时对相关进行了判定,如果为空则赋初始值 结果这样虽然实现了初始值的展示,但是就是如此造成了单选框的无法切…