CompletableFuture的底层他是如何实现的

底层原理

        CompletableFuture是Java8中引入的新特性,像我们平常遇到的, 某一个计算过程依赖于另外一个计算过程的结构,这些结构就类似于一种链表的形式来体现,每一个阶段都代表着一种异步的操作, 然后这些阶段又是相互依赖的, 基于一种链式的操作.

        官方点来解释就是

        每个 CompletableFuture 都有一个与之关联的 Completion 链,它可以包含多个 Completion 阶段,每个阶段都代表一个异步操作,并且可以指定它所依赖的前一个阶段的计算结果。

        CompletableFuture 还使用了一种事件驱动的机制来处理异步计算的完成事件。在一个 CompletableFuture 对象上注册的 Completion 阶段完成后,它会触发一个完成事件,然后 CompletableFuture 对象会执行与之关联的下一个 Completion 阶段。

CompletableFuture 的异步计算是通过线程池来实现的。CompletableFuture在内部使用了一个ForkJoinPool线程池来执行异步任务。当我们创建一个CompletableFuture对象时,它会在内部创建一个任务,并提交到ForkJoinPool中去执行。

应用场景

        

import java.util.Arrays;
import java.util.List;
import java.util.concurrent.CompletableFuture;public class CompletableFutureDemo {public static void main(String[] args) {List<Integer> nums = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);List<CompletableFuture<Integer>> futures = nums.stream().map(value -> CompletableFuture.supplyAsync(() -> {// 这里是每个异步任务要执行的操作,return value;})).collect(Collectors.toList());CompletableFuture<Integer> sumFuture = CompletableFuture.allOf(futures.toArray(new CompletableFuture[0])).thenApplyAsync(v -> {// 所有异步计算任务完成后,将它们的结果进行合并int sum = futures.stream().mapToInt(CompletableFuture::join).sum();return sum;});int sum = sumFuture.join();System.out.println(sum);}
}

可以将结果传递给下一个阶段,以继续进行计算 

可以将结果传递给下一个阶段,以继续进行计算

//异步通知下游系统
CompletableFuture<Void> allFutures = CompletableFuture.allOf(noticeDetails.stream().map(detail -> CompletableFuture.supplyAsync(() -> {notice(detail);return null;})).toArray(CompletableFuture[]::new));//所有任务通知成功后,更新代还通知单
allFutures.whenComplete((v, e) -> {if (e == null) {noticeOrder.setState("SUCCESS");Boolean res = noticeOrderService.updateById(noticeOrder);Assert.isTrue(res, "update failed");} else {log.error("notice failed", e);}
});

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

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

相关文章

【论文复现|智能算法改进】基于改进麻雀算法的无线传感器网络覆盖优化研究

目录 1.算法原理2.改进点3.结果展示4.参考文献5.代码获取 1.算法原理 【智能算法】麻雀搜索算法&#xff08;SSA&#xff09;原理及实现 WSN数学模型 2.改进点 基于Sobol序列和ICMIC混沌映射的种群初始化 ICMIC是一种无线映射折叠次数的映射模型: { z n 1 sin ⁡ ( α π…

客户案例|Zilliz Cloud 助力点石科技转型 AI 智能服务商

福建点石科技网络科技有限公司成立于2010年&#xff0c;是国家高新技术企业&#xff0c;阿里云、蚂蚁金服等大厂海内外生态合作伙伴ISV。在餐饮、零售、酒店、旅游、商圈的行业定制化服务化上有深厚积累&#xff0c;在境内外做了大量标杆性软件项目&#xff0c;如东南亚RWS圣淘…

Vite + Vue 3 前端项目实战

一、项目创建 npm install -g create-vite #安装 Vite 项目的脚手架工具 # 或者使用yarn yarn global add create-vite#创建vite项目 create-vite my-vite-project二、常用Vue项目依赖安装 npm install unplugin-auto-import unplugin-vue-components[1] 安装按需自动导入组…

Python | 试卷刷题and基础笔记

1.下列转义字符中&#xff0c; 属于“回车”含义的是 \n 换行 \r 回车 2.for循环遍历字典 在Python中&#xff0c;你可以使用for循环来遍历字典的键&#xff08;keys&#xff09;、值&#xff08;values&#xff09;或者键-值对&#xff08;items&#xff09;。下面是三种遍历…

supervisord常用命令及服务配置记录

whereis supervisor主进程配置文件&#xff1a;/etc/supervisord.conf 子进程配置文件&#xff1a;/etc/supervisor/conf.d 启动supervisor服务 sudo supervisord -c /etc/supervisor/supervisord.conf关闭supervisor则执行命令 sudo supervisorctl shutdown重启supervisor则…

Postman接口测试笔记(超详细)

基于工具Poatman的接口自动化基础应用以及接口关联 一、什么是接口&#xff1f; 硬件接口&#xff1a;USB接口&#xff0c;投影仪接口&#xff0c;鼠标键盘接口 软件接口&#xff1a;称为API&#xff0c;主要使用于数据交互 软件接口分类&#xff1a; 内部接口&#xff1a…

Vue3实战笔记(61)—Vue 3 Watch进化论:解锁实时数据监听新境界

文章目录 前言基本使用总结 前言 Vue 3 中的 watch 功能相比Vue 2有了改进和扩展&#xff0c;旨在提供更灵活的数据监听方式。 基本使用 Vue 3中的watch可以用于Composition API和Options API&#xff0c;但Composition API的使用更为常见。它主要用于监听响应式数据的变化&a…

树莓派5烧系统和ssh远程实现

1、硬件说明 树莓派5 64G micro SD卡读卡器 2、烧录系统过程记录 之前写过一篇pi4B烧录Ubuntu22.04的博客&#xff0c;这篇就简单记录备份下 2.1 去ubuntu官网在树莓派上安装Ubuntu | Ubuntu下载Ubuntu 桌面 24.04 LTS 我之前已经下好了就有个(1) 2.2 用读卡器把SD卡插到…

富格林:采用安全出金操作方法

富格林指出&#xff0c;现货黄金投资是近几年来热门的投资产品&#xff0c;剧烈的行情波动会给投资者带来充分的盈利机会&#xff0c;让不少投资者都开始投身于黄金市场。不过对于新手而言&#xff0c;要想实现安全盈利出金并没有那么容易&#xff0c;需要把握一些正规的交易技…

实战:一款唯美的个人主页-home2.0-2024.6.4(测试成功)

目录 文章目录 目录实验软件前提条件效果说明1、背景2、配置1、克隆代码库2、配置并构建镜像3、部署测试方案1&#xff1a;从docker容器拷贝生成的静态文件放到网站/目录方案2&#xff1a;启动容器&#xff0c;nginx里配置反向代理&#xff08;推荐&#xff09; 4、访问 3、总结…

“物联网安全:万物互联背景下的隐私保护与数据安全策略“

在物联网&#xff08;IoT&#xff09;时代&#xff0c;随着智能设备的普及和万物互联的加速&#xff0c;隐私保护与数据安全成为了亟待解决的关键问题。以下是一些重要的隐私保护与数据安全策略&#xff0c;以确保在万物互联背景下信息的安全&#xff1a; 1. 加强设备安全&…

.NET Core 应用程序发布指南

引言 .NET Core 是一个开源、跨平台的框架&#xff0c;用于构建现代化的、高性能的应用程序。本文将介绍如何将一个 .NET Core 应用程序发布到不同的环境中&#xff0c;包括本地、云端和容器化部署。 准备工作 在开始之前&#xff0c;请确保您的开发环境已经安装了以下工具&…

MySQL数据库开发设计规范总结

MySQL数据库开发设计规范总结 概述MySQL数据库设计规范设计规范-库设计规范-表、列设计规范-索引跟索引相关的SQL优化设计规范-视图设计规范-存储过程设计规范-触发器设计规范-安全规范 数据库架构设计原则一、高可用架构选择二、扩展性三、安全性策略四、数据完整性策略五、规…

全球首款AR电脑上线,可投影100英寸屏幕

近日&#xff0c;Sightful公司推出了一款名为Spacetop G1的革命性笔记本电脑&#xff0c;将AR技术与传统笔记本电脑巧妙融合&#xff0c;打造出令人惊叹的全新办公体验。 全球首款AR电脑上线&#xff0c;可投影100英寸屏幕 不同于传统笔记本电脑依赖物理屏幕显示内容&#xff0…

异常概述

自学python如何成为大佬(目录):https://blog.csdn.net/weixin_67859959/article/details/139049996?spm1001.2014.3001.5501 在程序运行过程中&#xff0c;经常会遇到各种各样的错误&#xff0c;这些错误统称为“异常”。这些异常有的是由于开发者将关键字敲错导致的&#xf…

重学java 63.IO流 字节流 ④ 文件复制

身处泥泞&#xff0c;看满山花开 —— 24.6.4 图片复制 分析 1.创建两个对象 FilelnputStream —>读取指定的文件 FileOutputStream —> 将读到的字节写到指定的位置 2.边读边写 import java.io.FileInputStream; import java.io.FileOutputStream;public class Demo…

2024年湖北省中级职称代申报不通过扣除手续费套路满满

2024年湖北省中级职称代申报不通过扣除手续费套路满满 建筑类中级职称&#xff0c;市场需求大。建筑企业、人才、工程项目招投标等等都需要一定数量的中级职称。建筑类中级职称申报一年1-2批次。湖北省不同地级市安排不同。湖北建筑类中级职称申报方式 1.公司内部组织申报&…

二进制安装Prometheus

从 https://prometheus.io/download/ 下载相应版本&#xff0c;安装到服务器上官网提供的是二进制版&#xff0c;解压就 能用&#xff0c;不需要编译 1、下载软件 [rootlocalhost ~]# wget -c https://github.com/prometheus/prometheus/releases/download/v2.45.5/prometheus…

训练Pytorch深度学习模型出现StopIteration

训练一个深度学习检测模型&#xff0c;突然出现&#xff1a; 是因为next(batch_iterator)&#xff0c;可能迭代器读出来的数据为空。 # load train data# 原先代码images, targets next(batch_iterator)# 更改为&#xff1a;try:images, targets next(batch_iterator)except…

Flutter 中的 ParentDataWidget 小部件:全面指南

Flutter 中的 ParentDataWidget 小部件&#xff1a;全面指南 Flutter 是一个由 Google 开发的跨平台 UI 框架&#xff0c;它提供了丰富的组件来帮助开发者构建高性能、美观的应用。在 Flutter 的布局体系中&#xff0c;ParentDataWidget 是一个抽象类&#xff0c;用于定义如何…