Java并发编程——CompletableFuture、Future和ForkJoinPool

在Java的并发编程中,CompletableFutureFutureForkJoinPool都是处理异步计算和任务分割的重要工具。下面我们将分别讨论这些工具及其用途。

1. Future

Future 是 Java 并发包 java.util.concurrent 中的一个接口,它代表了一个异步计算的结果。它提供了检查计算是否完成的方法(如 isDone()),以等待计算的完成(如 get()),并可能获取计算的结果或者抛出计算过程中的异常。

然而,Future 的主要问题是它不提供对计算进度的监听,也不支持计算结果的链式调用。这意味着一旦你提交了一个任务并获取了一个 Future 对象,你就需要轮询这个对象来查看任务是否完成,或者阻塞直到任务完成。

2. CompletableFuture

CompletableFuture 是 Java 8 引入的一个类,它实现了 FutureCompletionStage 接口,为异步编程提供了更丰富的功能。它支持函数式编程,允许你链式地组合异步计算的结果,而且提供了对计算进度的监听能力。

CompletableFuture 的主要特性包括:

  • 异步编程:你可以提交一个异步任务,并立即得到一个 CompletableFuture 对象。
  • 链式调用:你可以使用 .thenApply(), .thenAccept(), .thenCompose() 等方法链式地处理异步计算的结果。
  • 异常处理:你可以使用 .exceptionally() 方法来处理异步计算过程中抛出的异常。
  • 结果合并:你可以使用 .thenCombine().thenAcceptBoth() 方法来合并两个 CompletableFuture 的结果。
  • 进度监听:虽然 CompletableFuture 本身没有直接的进度监听机制,但你可以通过其他方式(如使用 AtomicInteger 作为进度计数器)来实现。

3. ForkJoinPool

ForkJoinPool 是 Java 7 引入的一个线程池,它专门用于处理可以递归地拆分为更小任务的计算任务。它采用“工作窃取”算法,使得空闲的线程可以从其他线程的队列中“窃取”任务来执行,从而提高了线程的使用效率。

ForkJoinPool 的主要特性包括:

  • 递归任务分割:你可以将一个大任务拆分为多个小任务,并将这些小任务提交给 ForkJoinPool 执行。这些小任务还可以进一步拆分为更小的任务。
  • 工作窃取:当一个线程完成了它的所有任务时,它会尝试从其他线程的队列中“窃取”任务来执行。这有助于平衡负载,并减少线程的空闲时间。
  • 结果合并ForkJoinTaskForkJoinPool 中执行的任务)的 join() 方法会返回任务的结果。你可以使用这个结果来合并子任务的结果。

需要注意的是,虽然 ForkJoinPool 对于可以递归地拆分为更小任务的计算任务非常有效,但它并不适合所有类型的并发任务。如果你的任务不能有效地进行拆分,或者你的任务之间存在复杂的依赖关系,那么使用 ForkJoinPool 可能并不是一个好的选择。

总结

  • Future 是一个简单的异步计算结果的表示,但功能有限。
  • CompletableFuture 提供了更丰富的异步编程功能,支持链式调用和异常处理。
  • ForkJoinPool 是一个专门用于处理可递归拆分的任务的线程池,采用工作窃取算法来提高效率。

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

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

相关文章

0513student的Maven项目

0513student的Maven项目包-CSDN博客 数据库字段 主页需求 点击休学按钮, 实现对 ‘’是否休学‘’ ‘’休学操作‘’ 的相应修改; 还有对数据库中相应学生休学状态修改。

11 | 如何实现高性能的异步网络传输?

理想的异步网络框架应该是什么样的? 这就是同步网络 IO 的模型。同步网络 IO 模型在处理少量连接的时候,是没有问题的。但是如果要同时处理非常多的连接,同步的网络 IO 模型就有点儿力不从心了。 因为,每个连接都需要阻塞一个线程来等待数据,大量的连接数就会需要相同数量…

vue3+TS或JS, 实现粒子特效 @tsparticles/vue3

在跟着B站视频BV11s4y1a71T学习时,使用到了粒子效果,但是以下这种情况只适用于项目是基于typescript的写法,否则无法实现。 粒子效果 VUE3TStsparticles/vue31、安装2、main.ts 引入3、App.vue4、效果 VUE3JS非最新版1、安装低版本的vue3-pa…

基于Java+SpringBoot+Vue前后端分离幼儿园管理系统设计与实现(有视频讲解)

博主介绍:✌全网粉丝5W,全栈开发工程师,从事多年软件开发,在大厂呆过。持有软件中级、六级等证书。可提供微服务项目搭建与毕业项目实战,博主也曾写过优秀论文,查重率极低,在这方面有丰富的经验…

git-删除workspace.xml的跟踪

问题描述 .gitignore 文件内容如下: .pyc *.pyc user_files/ .vscode/ __pycache__//.idea/misc.xml /.idea/modules.xml /.idea/inspectionProfiles/profiles_settings.xml /.idea/inspectionProfiles/Project_Default.xml /.idea/batrp_webbackend-server-dev.i…

申请免费的必应搜索API

申请免费的必应搜索API 文章目录 申请免费的必应搜索API前言一、原理1.1 登录1.2 进入1.3 获取密钥1.4 申请VISA信用卡1.5 创建必应自定义搜索资源 二、创建成功 前言 准备条件: 1、outlook邮箱 2、招商银行全币种VISA信用卡【建议之前就有一张招商银行信用卡&…

棒材直线度测量仪 专为圆形产品研发设计 在线无损检测

棒材直线度测量仪采用了先进的技术,能够实现在线无损检测,为生产过程提供了极大的便利。专为圆形产品设计,它能够精确测量棒材的米直线度及外径、椭圆度尺寸,为质量控制提供可靠的数据支持。 在线直线度测量仪不仅具有出色的性能…

Spring整合其他技术

文章目录 Spring整合mybatis思路分析Mybatis程序核心对象分析整合Mybatis 代码实现 Spring整合Junit修改成警告 Spring整合mybatis 思路分析 Mybatis程序核心对象分析 上面图片是mybatis的代码,上述有三个对象,分别是sqlSessionFactory,sqlS…

UVa11419 SAM I AM

UVa11419 SAM I AM 题目链接题意分析AC 代码 题目链接 UVA - 11419 SAM I AM 题意 给出一个 RC 大小的网格,网格上面放了一些目标。可以在网格外发射子弹,子弹会沿着垂直或者水平方向飞行,并且打掉飞行路径上的所有目标,如下图所…

Prosys OPC UA Simulation Server工程文件备份方法

Prosys OPC UA Simulation Server是一款免费的OPC UA服务器仿真软件,具体的使用和下载参考官网: Prosys OPC - OPC UA Simulation Server Downloads 他的免费版本不提供工程文件的备份、导入导出功能,每次退出时保存。如果需要工程备份&a…

灵卡 LCC262 高性能多功能数字视频和音频一体式采集卡详尽解读

一、前言 作为计算机视觉技术解决方案提供商——灵卡(LingCard)公司推出的新一代超群性能采集卡—— LCC262,以其卓越的性能表现和丰富多样的功能特性,为广大用户带来了前所未有的视频和音频处理体验。本文旨在对该产品进行详细解…

Vue 封装axios

【一】准备工作 (1)安装必要插件 安装Axios,这是必要的。默认最新版 npm install axios -S 或 cnpm install axios -S安装elementui-plus,用于提示信息 npm install element-plus --save # 或 cnpm install element-plus --s…

LangChain 核心模块学习 模型输入 Prompts

模型输入 Prompts 一个语言模型的提示是用户提供的一组指令或输入,用于引导模型的响应,帮助它理解上下文并生成相关和连贯的基于语言的输出,例如回答问题、完成句子或进行对话。 提示模板(Prompt Templates)&#xf…

洁太司检测试剂盒:肝癌早诊新利器,共筑健康未来

随着科技进步及医疗技术的不断创新,人类对疾病的早期诊断和治疗提出了更高的要求。 先思达生物近期推出的“洁太司-寡糖链检测试剂盒”,在原发性肝细胞癌的诊断领域实现了重大突破,获得了国家药品监督管理局(NMPA)的三…

JavaScript精粹(一)

JavaScript(简称为JS)是一种广泛应用于网页开发的脚本语言,具有以下几个主要作用: 网页交互:JavaScript 可以用于创建动态的网页效果,例如响应用户的操作,实现页面内容的动态更新,以…

JAVA云his医院管理系统源码(如何解决传统HIS的弊端、在医院管理中的具体应用场景有哪些)

开发技术: 前端:AngularNginx; 后台:JavaSpring,SpringBoot,SpringMVC,SpringSecurity,MyBatisPlus等; 数据库:MySQL MyCat; 基于云计算技术…

FreeRTOS事件标志组

目录 一、事件标志组的概念 1、事件标志位 2、事件标志组 二、事件标志组相关API 1、创建事件标志组 2、设置事件标志位 3、清除事件标志位 4、等待事件标志位 三、事件标志组实操 1、实验需求 2、CubeMX配置 3、代码实现 一、事件标志组的概念 1、事件标志位 表…

【Windows】回忆Win98

回忆Win98,又看到了这个Excel界面,上次还是十多年前的计算机课上 1、安装环境 Win11家庭版,23H2,VMware Workstation Pro 16 , 2、安装步骤及参考 虚拟机里的硬盘设置成SATA(否则各种错误),安装MSDOS7.1&#xff…

【Java 演示灵活导出数据】

演示灵活导出数据 🎉🎉🎉🎉🎉🎉【小吴小吴bug全无开通公众号】关注公众号获取第一时间博客动态 背景今天临时起兴打开稀土掘金导航栏看到页面推广gitee项目恰巧最近也在学习python了解到python爬虫很厉害&…

eNSP PRO全面安装教程来了(文末附下载方式)

华为eNSP PRO已经全面开放了,这意味着用户可以自由地访问和使用这个模拟器,来进行以下活动: 「学习和培训」:对于正在准备华为认证(如HCIA、HCIP、HCIE)的专业人士来说,eNSP PRO提供了一个实际…