CompletableFuture的简单使用

news2024/10/7 18:31:00

原文地址:CompletableFuture原理与实践-外卖商家端API的异步化

CompletableFuture的介绍:

CompletableFuture是Java 8中引入的一种基于Future的异步编程机制。与传统的Future相比,CompletableFuture提供了更多的操作链支持,并且可以用灵活的方式来处理异步任务的结果,从而实现更加高效、简洁和优雅的异步编程。

CompletableFuture的主要特点包括:

  1. 方法链:CompletableFuture支持链式调用,即在每个方法返回CompletableFuture对象时,都可以继续调用后续方法,形成一个完整的方法链,从而实现对异步任务的串行或并行执行。

  2. 异常处理:CompletableFuture提供了非常好的异常处理机制,可以使用exceptionally或handle方法来抛出或捕获异常,并通过相应的回调函数进行处理。

  3. 结果聚合:CompletableFuture支持多个异步任务的聚合,即通过allOf或anyOf等方法来组合多个任务的结果,以及使用thenApplyAsync、thenCombine等方法进行结果的加工和归并。

  4. 灵活性:CompletableFuture还具有非常高的灵活性,可以结合Lambda表达式和函数式接口来实现更加优雅和简洁的异步编程方式。

总的来说,CompletableFuture是Java 8中非常重要的一种异步编程机制,它可以帮助我们提升系统的并发能力和响应性能,并且具有良好的可扩展性和可维护性。

CompletableFuture的简单使用

如下图所示,这里描绘的是一个业务接口的流程,其中包括CF1\CF2\CF3\CF4\CF5共5个步骤,并描绘了这些步骤之间的依赖关系,每个步骤可以是一次RPC调用、一次数据库操作或者是一次本地方法调用等,在使用CompletableFuture进行异步化编程时,图中的每个步骤都会产生一个CompletableFuture对象,最终结果也会用一个CompletableFuture来进行表示。

 根据CompletableFuture依赖数量,可以分为以下几类:零依赖、一元依赖、二元依赖和多元依赖。

3.2.1 零依赖:CompletableFuture的创建

e8f902649bcceff4d47562a486b3731b.png

 如上图红色链路所示,接口接收到请求后,首先发起两个异步调用CF1、CF2,主要有三种方式:

ExecutorService executor = Executors.newFixedThreadPool(5);
//1、使用runAsync或supplyAsync发起异步调用
CompletableFuture<String> cf1 = CompletableFuture.supplyAsync(() -> {
  return "result1";
}, executor);
//2、CompletableFuture.completedFuture()直接创建一个已完成状态的CompletableFuture
CompletableFuture<String> cf2 = CompletableFuture.completedFuture("result2");
//3、先初始化一个未完成的CompletableFuture,然后通过complete()、completeExceptionally(),完成该CompletableFuture
CompletableFuture<String> cf = new CompletableFuture<>();
cf.complete("success");

3.2.2 一元依赖:依赖一个CF

52a6d8338e97fcd57e1da5372a43a82e.png

如上图红色链路所示,CF3,CF5分别依赖于CF1和CF2,这种对于单个CompletableFuture的依赖可以通过thenApply、thenAccept、thenCompose等方法来实现,代码如下所示:

CompletableFuture<String> cf3 = cf1.thenApply(result1 -> {
  //result1为CF1的结果
  //......
  return "result3";
});
CompletableFuture<String> cf5 = cf2.thenApply(result2 -> {
  //result2为CF2的结果
  //......
  return "result5";
});

 3.2.3 二元依赖:依赖两个CF

7e1357aafb7dd4c15105d882155e8a63.png

如上图红色链路所示,CF4同时依赖于两个CF1和CF2,这种二元依赖可以通过thenCombine等回调来实现,如下代码所示:

CompletableFuture<String> cf4 = cf1.thenCombine(cf2, (result1, result2) -> {
  //result1和result2分别为cf1和cf2的结果
  return "result4";
});

3.2.4 多元依赖:依赖多个CF

45d8b9a6f4004b45563c03b28daf92c5.png

如上图红色链路所示,整个流程的结束依赖于三个步骤CF3、CF4、CF5,这种多元依赖可以通过allOfanyOf方法来实现,区别是当需要多个依赖全部完成时使用allOf,当多个依赖中的任意一个完成即可时使用anyOf,如下代码所示:

CompletableFuture<Void> cf6 = CompletableFuture.allOf(cf3, cf4, cf5);
CompletableFuture<String> result = cf6.thenApply(v -> {
  //这里的join并不会阻塞,因为传给thenApply的函数是在CF3、CF4、CF5全部完成时,才会执行 。
  result3 = cf3.join();
  result4 = cf4.join();
  result5 = cf5.join();
  //根据result3、result4、result5组装最终result;
  return "result";
});

 

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

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

相关文章

skywalking 9.x入门(二) skywalking全链路tid追踪

这里是weihubeats,觉得文章不错可以关注公众号小奏技术&#xff0c;文章首发。拒绝营销号&#xff0c;拒绝标题党 背景 继上次我们对skywalking整体架构作了一些了解&#xff0c;然后就是学习了spring boot项目如何基于agent接入skywalking 这次我们要实现的是spring boot项目…

USB | 查询usb设备占用带宽

USB | 查询usb设备占用带宽 请教一下windows下有什么工具能查询usb设备占用带宽吗&#xff1f;Linux上有usbtop&#xff0c;windows有类似工具吗 DeviceMonitoringStudio设备监控工具的使用

好用的自动化框架-Allure

概述 报告主要包含总览、类别、测试套件、图表、时间刻度、功能、包等7大部分&#xff0c;支持自定义诸多信息&#xff0c;包括附件添加、缺陷链接、案例链接、测试步骤、Epic、Feature、Story、Title、案例级别等&#xff0c;相当强大。 allure与pytest的结合使用可以呈现完…

华为OD机试真题B卷 Java 实现【求小球落地5次后所经历的路程和第5次反弹的高度】,附详细解题思路

一、题目描述 假设一个球从任意高度自由落下&#xff0c;每次落地后反跳回原高度的一半; 再落下, 求它在第5次落地时&#xff0c;共经历多少米?第5次反弹多高&#xff1f; 数据范围&#xff1a;输入的小球初始高度满足 1 \le n \le 1000 \1≤n≤1000 &#xff0c;且保证是一…

Mysql存储过程的递归调用及数据量过大group_concat()显示不全的问题

业务场景 使用mysql group_concat()函数&#xff0c;对查询的数据进行字符串连接操作。 由于查询的结果较多&#xff0c;连接后的结果很长导致不能完全显示。 第一种解决方案&#xff08;不需要重启Mysql, 如果mysql重启后设置会失效&#xff0c;需重新设置&#xff09; 执行…

代码随想录-哈希表

学习《代码随想录》 基础知识哈希函数哈希碰撞三种哈希结构 有效的字母异位词两个数组的交集两数之和暴力法Map 四数相加三数之和哈希解法双指针法 四数之和 基础知识 哈希表是一种根据关键码的值直接访问数据的数据结构。一般用来快速判断一个元素是否出现在集合中。 哈希函…

【AUTOSAR】Com通讯栈配置说明(二)---- CanIf模块

CanIf模块 CanIfCtrlDrvCfgs CanIfCtrlDrvBusOffNotification:busoff 发生后的callback函数 CanIfCtrlDrvWakeupNotification: wakeup 发生后的callback函数 CanIfCtrlId: 逻辑Canif id CanIfWakeupSupport:是否支持唤醒 CanIfMaxDlc:最大报文长度 CanIfCtrlCanCtrlRef: 关联…

我们是如何管理蓝精灵协会 PFP 集合的程序性生成的?

自从 Cryptopunks 和 Bored Apes 发布以来&#xff0c;大多数蓝筹 NFT 系列都在其创意基准中使用了相同的反复出现的概念&#xff1a;一幅插图肖像&#xff08;也称为 PFP&#xff0c;用于个人资料图片或证明图片&#xff09;通过使用随机分布的定制层而被改变成几千种略有不同…

【回顾经典AI神作】理解和实现ResNeXt(比ResNet最先进的图像分类模型)

与 ResNet 相比好在哪里? 相同的参数个数,结果更好:一个 101 层的 ResNeXt 网络,和 200 层的 ResNet 准确度差不多,但是计算量只有后者的一半 论文参考:https://arxiv.org/pdf/1611.05431.pdf 以下三篇是介绍和改进残差网络的论文: 用于图像识别的深度残差学习(链接…

ELECTRA模型简单介绍

目录 一、整体概要 二、生成器 三、判别器 四、模型训练 五、其它改进 一、整体概要 ELECTRA&#xff08;Efficiently Learning an Encoder that Classifies Token Replacements Accurately&#xff09;采用了一种“生成器——判别器”结构&#xff0c;其与生成式对抗网络…

报表服务器Stimulsoft Server v2023.2亮点:支持PostgreSQL、选项卡

Stimulsoft Server&#xff08;原Stimulsoft Reports.Server&#xff09;是一款完善的商业智能解决方案&#xff0c;采用C/S架构&#xff0c;提供报告和分析功能。前端用来展现数据&#xff0c;后台用来处理和存储数据。Stimulsoft Server&#xff08;原Stimulsoft Reports.Ser…

IDEA性能优化设置(解决卡顿问题)

在我们日常使用IDEA进行开发时&#xff0c;可能会遇到许多卡顿的瞬间&#xff0c;明明我们的机器配置也不低啊&#xff1f;为什么就会一直卡顿呢&#xff1f; 原来这是因为IDEA软件在我们安装的时候就设置了默认的内存使用上限&#xff08;通常很小&#xff09;&#xff0c;这就…

成都远石无人机航测服务的具体内容

成都远石拥有多年西南地区无人机航测作业经验&#xff0c;现具备DEM、DSM、DOM、三维实景模型及机载激光雷达全套数据成果的生产能力&#xff0c;致力于为各个行业提供准确的数据支持。现在&#xff0c;小编就来给大家介绍成都远石无人机航测服务的具体内容。 1、数字高程模型…

SocketTools Library Edition C++ Crack

SocketTools 库版 SocketTools Library Edition 是一套 Windows 库&#xff0c;可简化 Internet 应用程序开发。它提供您入门所需的一切&#xff0c;包括文档和示例&#xff0c;以及免费的技术支持来回答您遇到的任何开发问题。SocketTools Library Edition 包括本机 Windows 库…

Java集成influxDB 默认UTC时区问题

dd 我用的influxDB 1.8版本高版本我不清楚&#xff0c;因为1.x版本便于写sq语法。 influxDB时序库默认使用 UTC时区&#xff0c;并且无法通过配置来修改这个时区&#xff0c;很多文档说在查询数据的时候加上 tz(Asia/Shanghai)。 而这个在Windows环境下的influxdb会报错…

【youcans动手学模型】AlexNet模型CIFAR10图像分类

欢迎关注『youcans动手学模型』系列 本专栏内容和资源同步到 GitHub/youcans 【youcans动手学模型】AlexNet模型CIFAR10图像分类 1. AlexNet 卷积神经网络模型1.1 论文简介1.2 AlexNet 的主要贡献1.3 AlexNet 网络1.4 模型的运行结果 2. 在 PyTorch 中定义 AlexNet 模型类2.1 按…

Qt编写视频监控系统77-Onvif组件支持非正常时间的设备

一、前言 在经历了大量的现场设备测试&#xff0c;至少几十种厂家、几百种设备&#xff0c;遇见过奇奇怪怪的问题&#xff0c;一个个想方设法解决&#xff0c;发现有个问题是在下发鉴权的时候&#xff0c;需要带上设备的时间&#xff0c;而不是发送端的时间&#xff0c;如果带…

LeetCode 1110. 删点成林

【LetMeFly】1110.删点成林 力扣题目链接&#xff1a;https://leetcode.cn/problems/delete-nodes-and-return-forest/ 给出二叉树的根节点 root&#xff0c;树上每个节点都有一个不同的值。 如果节点值在 to_delete 中出现&#xff0c;我们就把该节点从树上删去&#xff0c…

MySQL 系统信息函数

文章目录 系统信息函数1. 查看当前 MySQL 数据库版本号2. 查看当前使用的数据库3. 查看当前服务器连接次数 系统信息函数 当我们需要知道当前 MySQL 数据库的一些基本信息和使用情况的时候&#xff0c;可以使用系统信息函数来获取相关信息&#xff0c;以随时掌握数据库的使用情…

【C++系列P2】引用——背刺指针的神秘刺客(精讲一篇过!)

前言 大家好吖&#xff0c;欢迎来到 YY 滴 C系列 &#xff0c;热烈欢迎&#xff01;如标题所示&#xff0c;本章主要内容主要来侃侃“引用”这个刺客&#xff01;如下就是大纲啦~ 一.引用 1.含义与特点 引用&#xff0c;即取别名。它的最大特点是编译器不会为引用变量而开辟空间…