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

news2024/10/9 14:22:54

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。
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.coloradmin.cn/o/1568371.html

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

相关文章

AI结合机器人的入门级仿真环境有哪些?

由于使用真实的机器人开发和测试应用程序既昂贵又费时&#xff0c;因此仿真已成为机器人应用程序开发中越来越重要的部分。在部署到机器人之前在仿真中验证应用程序可以通过尽早发现潜在问题来缩短迭代时间。通过模拟&#xff0c;还可以更轻松地测试在现实世界中可能过于危险的…

优酷动漫顶梁柱!神话大乱炖的修仙番为何火爆?

优酷动漫新晋顶梁柱&#xff0c;实时超160万在追的修仙番长啥样&#xff1f; 由优酷动漫联合玄机科技打造的《师兄啊师兄》俨然成为了国漫界一颗璀璨的新星。自去年开播以来热度口碑双丰收&#xff0c;今年在播的第二季人气更是节节攀升&#xff0c;稳坐优酷动漫榜第一把交椅。…

水果销售(源码+文档)

水果销售管理系统&#xff08;小程序、ios、安卓都可部署&#xff09; 文件包含内容程序简要说明含有功能项目截图客户端添加地址首页商品详细意见反馈待发货商品分类我的代付款我的地址搜索防骗指南资料修改登录注册 后端管理分类管理反馈管理订单管理商品管理用户管理 文件包…

Java23种设计模式

本文主要是对Java中一些常用的设计模式进行讲解 后期会进行不断的更新&#xff0c;欢迎浏览 23种设计模式 创建型模式&#xff0c;共五种&#xff1a;工厂方法模式、抽象工厂模式、建造者模式、原型模式、单例模式。结构型模式&#xff0c;共七种&#xff1a;适配器模式、桥接…

实战篇02:注册接口

实战篇02&#xff1a;注册接口 一、注册 1.1、接口信息 1.1.1 基本信息 请求路径&#xff1a;/user/register 请求方式&#xff1a;POST 接口描述&#xff1a;该接口用于注册新用户 1.1.2 请求参数 请求参数格式&#xff1a;x-www-form-urlencoded 请求参数说明&#xff1…

深入浅出 -- 系统架构之微服务架构

1.1 微服务的架构特征&#xff1a; 单一职责&#xff1a;微服务拆分粒度更小&#xff0c;每一个服务都对应唯一的业务能力&#xff0c;做到单一职责 自治&#xff1a;团队独立、技术独立、数据独立&#xff0c;独立部署和交付 面向服务&#xff1a;服务提供统一标准的接口&…

二维码的生成、下载Java,并返回给前端展示

分析 将生成的二维码图片&#xff0c;以IO流的方式&#xff0c;通过response响应体直接返回给请求方。 第一、不需要落到我们的磁盘&#xff0c;操作在内存中完成&#xff0c;效率比较高。 第二、所有生成二维码的请求&#xff0c;都可以访问这里&#xff0c;前端直接拿img标…

【Django学习笔记(三)】BootStrap介绍

BootStrap介绍 前言正文1、BootStrap 快速了解2、初识BootStrap2.1 下载地址2.2 创建目录2.3 引入BootStrap2.4 使用BootStrap 3、BootStrap 组件&样式3.1 导航条3.2 栅格系统3.3 container3.3.1 container3.3.2 container-fluid 3.4 面板3.5 媒体对象3.6 分页3.7 图标3.7.…

RedHat9中KVM虚拟机的配置与管理

KVM虚拟技术介绍 Linux的KVM&#xff08;Kernel-based Virtual Machine&#xff09;虚拟技术是一种基于Linux内核的虚拟化解决方案。它允许在单个物理服务器上创建和运行多个隔离的虚拟机&#xff0c;每个虚拟机都有自己的操作系统和应用程序&#xff0c;就像运行在独立的物理…

基于SpringBoot+Vue的版权检测管理系统的设计和实现【附源码】

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

ALPHA开发板上PHY网络芯片LAN8720

一. 简介 正点原子的开发板 ALPHA开发板&#xff0c;有线网络硬件方案所使用的也是最常用的一种方案&#xff0c;IMX6ULL芯片内部是自带 MAC网络芯片的&#xff0c;所以&#xff0c;也就是采用 "SOC内部集成网络MAC外设 PHY网络芯片方案"。 ALPHA开发板使用的PHY网…

web框架的本质初识

1.什么是HTML HTML是一个超文本语言&#xff0c;是一种创建网页结构的标记语言。就是你女朋友化妆之后的样子 2.什么是HTTP协议 是一种用于在Web上传输数据的协议。它是客户端和服务器之间进行相互通信的基础的协议 3.HTTP的特点 无连接&#xff1a;每个http请求都是独立的…

go库x/text缺陷报告CVE-2022-32149的处理方案

#问题描述 go库 golang.org/x/text &#xff0c;注意这里不是go的源码&#xff0c; 在0.3.8版本之前存在一个缺陷(Vulnerability) 缺陷ID CVE-2022-32149 具体描述 攻击者可以通过制作一个Accept-Language报头来导致拒绝服务。 具体的原因是&#xff0c;在解析这个Accept-L…

Vue 如何快速上手

目录 1. Vue 是什么 &#xff08;概念&#xff09; 1.1. Vue 的两种使用方式 1.2. 优点 1.3. 缺点 2. 创建 Vue 实例&#xff0c;初始化渲染 2.1. 步骤&#xff08;核心步骤 4步&#xff09; 2.2. 练习——创建一个Vue实例 3. 插值表达式 {{ }} 3.1. 介绍 3.2. 作用…

【Linux实验室】NFS、DHCP的搭建

NFS、DHCP的搭建 1、nfs服务搭建及测试什么是NFS&#xff1f;环境准备服务端机器安装nfs-utils和rpcbind包启动NFS服务创建/data/NFSdata目录&#xff0c;配置nfs文件启动服务挂载测试在服务端在共享目录下创建文件测试在客户端在共享目录下创建文件 2、dhcp服务搭建及测试什么…

python相对路径导包与绝对路径导包的正确方式

【python相对路径导包与绝对路径导包的正确方式】 python相对路径导包与绝对路径导包的正确方式_哔哩哔哩_bilibilipython导包的难题&#xff0c;今天解决了&#xff0c;相对路径导包和绝对路径导包&#xff0c;均可以&#xff01;&#xff01;&#xff01;, 视频播放量 5、弹…

golang 归并回源策略

前言 下面是我根据业务需求画了一个架构图&#xff0c;没有特别之处&#xff0c;很普通&#xff0c;都是我们常见的中间件&#xff0c;都是一些幂等性GET 请求。有一个地方很有意思&#xff0c;从service 分别有10000 qps 请求到Redis&#xff0c;并且它们的key 是一样的。这样…

GDPU 竞赛技能实践 天码行空6

&#x1f4d6; 敌兵布阵 C国的死对头A国这段时间正在进行军事演习&#xff0c;所以C国间谍头子Derek和他手下Tidy又开始忙乎了。A国在海岸线沿直线布置了N个工兵营地,Derek和Tidy的任务就是要监视这些工兵营地的活动情况。由于采取了某种先进的监测手段&#xff0c;所以每个工…

数据库管理工具 DBeaverUE for Mac激活版

DBeaverUE for Mac是一款功能强大且易于使用的数据库管理工具&#xff0c;专为Mac用户设计。它支持多种数据库类型&#xff0c;如MySQL、PostgreSQL、Oracle等&#xff0c;使得用户可以轻松管理和操作各种数据库。 软件下载&#xff1a;DBeaverUE for Mac激活版下载 DBeaverUE …

GrayLog日志平台的基本使用-接入jumpserver

1、jumpserver3.8.0部署 Docker 环境准备 # 安装依赖包 yum install -y yum-utils device-mapper-persistent-data lvm2 # 添加源 yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo # 替换Docker 安装源为清华大学镜像站 sed -i sh…