【并发编程系列】使用 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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

[C#]OpenCvSharp利用MatchTemplate实现多目标匹配

【效果展示】 原图 模板图 匹配结果&#xff1a; 【实现部分代码】 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using…

RabbitMQ3.x之九_Docker中安装RabbitMQ

RabbitMQ3.x之_Docker中安装RabbitMQ 文章目录 RabbitMQ3.x之_Docker中安装RabbitMQ1. 官网2. 安装1 .拉取镜像2. 运行容器 3. 访问 1. 官网 rabbitmq - Official Image | Docker Hub 2. 安装 1 .拉取镜像 docker pull rabbitmq:3.13.0-management2. 运行容器 # latest Rabb…

从零起步:开启你的IT职业之旅

简介&#xff1a; 信息技术&#xff08;IT&#xff09;行业以其快速发展和广阔的就业前景吸引着全球众多职场新人。但对于零基础的求职者而言&#xff0c;挺进这一行业似乎是条充满挑战的道路。进入IT行业可能看起来是一项艰巨的挑战&#xff0c;尤其是对于那些没有任何相关经…

伪造靶机之iptables

伪造禁ping、网络不可达、主机不可达、协议、端口的命令 iptables -A INPUT -p icmp --icmp-type echo-request -j DROP iptables -A INPUT -s 172.18.6.89 -p icmp -j REJECT --reject-with icmp-net-unreachable iptables -A INPUT -s 172.18.6.89 -p icmp -j REJECT --re…

【Canavs与艺术】绘制蓝白绶带大卫之星勋章

【图例】 【代码】 <!DOCTYPE html> <html lang"utf-8"> <meta http-equiv"Content-Type" content"text/html; charsetutf-8"/> <head><title>用Canvas绘制蓝白绶带大卫之星勋章</title><style type&quo…

Python如何解决“滑动拼图”验证码(8)

前言 本文是该专栏的第67篇,后面会持续分享python爬虫干货知识,记得关注。 做过爬虫项目的同学,或多或少都会接触到一些需要解决验证码才能正常获取数据的平台。 在本专栏之前的文章中,笔者有详细介绍通过python来解决多种“验证码”(点选验证,图文验证,滑块验证,滑块…

网络协议——VRRP(虚拟路由冗余协议)原理与配置

1. VRRP概述 单网关出现故障后下联业务中断&#xff0c;配置两个及以上的网关时由于IP地址冲突&#xff0c;导致通讯时断时续甚至通信中断。VRRP组播类的网络层协议 2. 协议版本 VRRP v2: 支持认证,仅适用于IPv4网络 VRRP v3: 不支持认证&#xff0c; 适用于IPv4和IPv6两种网…

【Leetcode笔记】102.二叉树的层序遍历

目录 知识点Leetcode代码&#xff1a;ACM模式代码&#xff1a; 知识点 vector、queue容器的操作 对vector<int> vec;做插入元素操作&#xff1a;vec.push_back(x)。对queue<TreeNode*> que;做插入元素操作&#xff1a;que.push(root);。队列有四个常用的操作&…

【Python系列】 yaml中写入数据

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

普联一面4.2面试记录

普联一面4.2面试记录 文章目录 普联一面4.2面试记录1.jdk和jre的区别2.java的容器有哪些3.list set map的区别4.get和post的区别5.哪个更安全6.java哪些集合类是线程安全的7.创建线程有哪几种方式8.线程的状态有哪几种9.线程的run和start的区别10.什么是java序列化11.redis的优…

深度解读DynamIQ架构cache的替换策略

快速链接: 【精选】ARMv8/ARMv9架构入门到精通-[目录] &#x1f448;&#x1f448;&#x1f448; 思考: 在经典的 DynamIQ架构 中&#xff0c;数据是什么时候存在L1 cache&#xff0c;什么时候存进L2 cache&#xff0c;什么时候又存进L3 cache&#xff0c;以及他们的替换策略是…

ArcGIS Pro导出布局时去除在线地图水印

目录 一、背景 二、解决方法 一、背景 在ArcGIS Pro中经常会用到软件自带的在线地图&#xff0c;但是在导出布局时&#xff0c;图片右下方会自带地图的水印 二、解决方法 解决方法&#xff1a;添加动态文本--服务图层制作者名单&#xff0c;然后在布局中选定位置添加 在状…

红蓝色WordPress外贸建站模板

红蓝色WordPress外贸建站模板 https://www.mymoban.com/wordpress/5.html

【Java】打包:JAR、EAR、WAR

打包&#xff1a;JAR、EAR、WAR war 是一个 Web 模块&#xff0c;其中需要包括 WEB-INF&#xff0c;是可以直接运行的 WEB 模块。而 jar 一般只是包括一些 class 文件&#xff0c;在声明了 main_class 之后是可以用 java 命令运行的。 它们都是压缩的包&#xff0c;拿 Tomcat …

LeetCode_234(回文链表)

//时间复杂度O(n) 空间复杂度O(1)public boolean isPalindrome(ListNode head) {ListNode fast head,slow head;while (fast !null && fast.next !null){fast fast.next.next;slow slow.next;}//如果链表是奇数个结点&#xff0c;把正中的归到左边if(fast ! null){s…

操作系统的信号量操作以及实战中的踩坑分析

往期地址&#xff1a; 操作系统系列一 —— 操作系统概述操作系统系列二 —— 进程操作系统系列三 —— 编译与链接关系操作系统系列四 —— 栈与函数调用关系操作系统系列五 —— 目标文件详解操作系统系列六 —— 详细解释【静态链接】操作系统系列七 —— 装载操作系统系列…

洛谷B3735题解

题目描述 圣诞树共有 n 层&#xff0c;从上向下数第 1 层有 1 个星星、第 2 层有 2 个星星、以此类推&#xff0c;排列成下图所示的形状。 星星和星星之间用绳子连接。第 1,2,⋯,n−1 层的每个星星都向下一层最近的两个星星连一段绳子&#xff0c;最后一层的相邻星星之间连一段…

【开发、测试】接口规范与测试

接口测试基础 url 是互联网标准资源地址&#xff0c;称为统一资源定位符 组成&#xff1a;协议&#xff0c;服务器地址&#xff0c;端口号 HTTP协议 HTTP&#xff1a;超文本传输协议&#xff0c;基于请求与响应的应用层协议 作用&#xff1a;规定了客户端和服务器之间的信…

Spring声明式事务以及事务传播行为

Spring声明式事务以及事务传播行为 Spring声明式事务1.编程式事务2.使用AOP改造编程式事务3.Spring声明式事务 事务传播行为 如果对数据库事务不太熟悉&#xff0c;可以阅读上一篇博客简单回顾一下&#xff1a;MySQL事务以及并发访问隔离级别 Spring声明式事务 事务一般添加到…

前端工程师————CSS学习

选择器分类 选择器分为基础选择器和复合选择器 基础选择器包括&#xff1a;标签选择器&#xff0c;类选择器&#xff0c;id选择器&#xff0c;通配符选择器标签选择器 类选择器 语法&#xff1a;.类名{属性1&#xff1a; 属性值&#xff1b;} 类名可以随便起 多类名使用方式&am…