首页/新闻资讯/正文详情

【Java异步编程】CompletableFuture实现:异步任务的合并执行

发布时间:2026/11/3 18:24:06 来源:云帆数科 栏目:资讯中心
【Java异步编程】CompletableFuture实现:异步任务的合并执行
文章目录一. 合并两个异步任务的结果1. thenCombine()组合两个异步任务的结果2. runAfterBoth()在两个任务完成后执行无返回值操作3. thenAcceptBoth()消费两个任务的结果二. allOf()等待所有任务完成如果某个任务同时依赖另外两个异步任务的执行结果就需要对另外两个异步任务进行合并。以泡茶喝为例​“泡茶喝”任务需要对“烧水”任务与“清洗”任务进行合并。对两个异步任务的合并可以通过CompletionStage接口的thenCombine()、runAfterBoth()、thenAcceptBoth()三个方法来实现。一. 合并两个异步任务的结果1.thenCombine()组合两个异步任务的结果thenCombine()方法允许我们同时处理两个异步任务的结果。当这两个任务都完成时它会执行一个BiFunction将两个任务的结果组合起来并返回一个新的CompletableFuture该CompletableFuture包含组合后的结果。使用场景当你有两个异步任务且需要同时使用它们的结果来进行某些操作时thenCombine()非常适合。示例代码CompletableFutureIntegerfuture1CompletableFuture.supplyAsync(()-2);CompletableFutureIntegerfuture2CompletableFuture.supplyAsync(()-3);future1.thenCombine(future2,(result1,result2)-result1result2).thenAccept(result-System.out.println(result));// 输出 5**分析**-future1 和 future2 是两个异步任务分别返回 2 和 3。-thenCombine() 会将这两个结果相加并返回 5。-thenAccept() 最终打印出 5。例子2TestpublicvoidthenCombineDemo()throwsException{CompletableFutureIntegerfuture1CompletableFuture.supplyAsync(newSupplierInteger(){OverridepublicIntegerget(){IntegerfirstStep1010;Print.tco(firstStep outcome is firstStep);returnfirstStep;}});CompletableFutureIntegerfuture2CompletableFuture.supplyAsync(newSupplierInteger(){OverridepublicIntegerget(){IntegersecondStep1010;Print.tco(secondStep outcome is secondStep);returnsecondStep;}});CompletableFutureIntegerfuture3future1.thenCombine(future2,newBiFunctionInteger,Integer,Integer(){OverridepublicIntegerapply(Integerstep1OutCome,Integerstep2OutCome){returnstep1OutCome*step2OutCome;}});Integerresultfuture3.get();Print.tco( outcome is result);}2.runAfterBoth()在两个任务完成后执行无返回值操作runAfterBoth()方法会在两个异步任务都完成后执行一个没有返回值的操作。与thenCombine()不同它不关心这两个任务的结果而是专注于在它们都完成后做某些操作比如记录日志、更新状态等。使用场景当你希望在两个异步任务都完成后执行某些副作用操作但不关心它们的计算结果时runAfterBoth()是最理想的选择。示例代码CompletableFutureIntegerfuture1CompletableFuture.supplyAsync(()-2);CompletableFutureIntegerfuture2CompletableFuture.supplyAsync(()-3);future1.runAfterBoth(future2,()-System.out.println(Both tasks completed));// 输出 Both tasks completed**分析**-runAfterBoth() 会在 future1 和 future2 都完成后执行无返回值的操作这里是打印出Both tasks completed。-重要的是它不会使用 future1 和 future2 的结果而仅在它们都完成时执行某个动作。3.thenAcceptBoth()消费两个任务的结果thenAcceptBoth()方法会在两个异步任务都完成后执行一个BiConsumer将这两个任务的结果作为参数传递给消费操作。它适用于在多个任务完成后需要处理这些结果的场景。使用场景当你希望在两个任务都完成时同时处理它们的结果但不需要返回任何新的结果时thenAcceptBoth()非常适用。示例代码CompletableFutureIntegerfuture1CompletableFuture.supplyAsync(()-2);CompletableFutureIntegerfuture2CompletableFuture.supplyAsync(()-3);future1.thenAcceptBoth(future2,(result1,result2)-System.out.println(Result1: result1, Result2: result2));// 输出 Result1: 2, Result2: 3**分析**-thenAcceptBoth() 会在 future1 和 future2 都完成后执行 BiConsumer并将两个任务的结果传入。-这里我们打印出 Result1:2 和 Result2:3显示了两个任务的计算结果。二.allOf()等待所有任务完成allOf()方法接受多个CompletableFuture作为参数并返回一个新的CompletableFutureVoid该CompletableFuture在所有输入的任务都完成时才完成。它通常用于等待多个异步任务全部完成并且不关心它们的结果。使用场景当你有多个异步任务并且你希望在它们都完成时继续执行某些操作而不需要关心每个任务的结果时可以使用allOf()。这是一个非常常用的场景特别是在执行多个独立的异步任务时。示例代码CompletableFutureIntegerfuture1CompletableFuture.supplyAsync(()-2);CompletableFutureIntegerfuture2CompletableFuture.supplyAsync(()-3);CompletableFutureIntegerfuture3CompletableFuture.supplyAsync(()-4);CompletableFutureVoidallOfCompletableFuture.allOf(future1,future2,future3);allOf.thenRun(()-System.out.println(All tasks are completed));// 输出 All tasks are completed**分析**-allOf() 会等待 future1、future2 和 future3 全部完成。-thenRun() 会在所有任务完成后执行并输出All tasks are completed。-需要注意的是allOf() 返回的 CompletableFutureVoid 不关心每个任务的计算结果只关注所有任务是否完成。thenRun用于在当前CompletableFuture完成后执行一个没有返回值的操作。它的作用类似于回调机制但不同于常规的回调函数thenRun()不接受任务的结果作为输入它只是执行一个副作用操作例如打印日志、更新状态等。例子2TestpublicvoidallOfDemo()throwsException{CompletableFutureVoidfuture1CompletableFuture.runAsync(()-Print.tco(模拟异步任务1));CompletableFutureVoidfuture2CompletableFuture.runAsync(()-Print.tco(模拟异步任务2));CompletableFutureVoidfuture3CompletableFuture.runAsync(()-Print.tco(模拟异步任务3));CompletableFutureVoidfuture4CompletableFuture.runAsync(()-Print.tco(模拟异步任务4));CompletableFutureVoidallCompletableFuture.allOf(future1,future2,future3,future4);all.join();}join()方法与get()类似但是它不会抛出InterruptedException或ExecutionException。相反如果任务失败join()会抛出CompletionException这意味着我们需要通过join()等待所有任务完成并且如果有任务失败CompletionException会包装抛出异常。

相关推荐

【高等数学】小结:微分方程题型说明
【高等数学】小结:微分方程题型说明

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/3 18:23:03

【人工智能基础】线性模型
【人工智能基础】线性模型

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/3 18:23:03

零基础入门PP-LCNet_x1_0_table_cls_onnx:开发者必知的10个核心概念
零基础入门PP-LCNet_x1_0_table_cls_onnx:开发者必知的10个核心概念

零基础入门PP-LCNet_x1_0_table_cls_onnx:开发者必知的10个核心概念 【免费下载链接】PP-LCNet_x1_0_table_cls_onnx 项目地址: https://ai.gitcode.com/paddlepaddle/PP-LCNet_x1_0_table_cls_onnx 想要快速掌握表格分类模型部署的核心技术吗?P… · 2026/11/3 18:23:03

思源宋体网页排版终极配置:加载优化与子集化实战
思源宋体网页排版终极配置:加载优化与子集化实战

1. 为什么思源宋体突然成了网页排版的“新刚需”? 最近在好几个前端项目复盘会上,团队都绕不开一个名字: Source Han Serif 思源宋体 。不是那种“听说很火就试试”的跟风,而是实实在在卡在交付节点上——某高校人文学院官网改版… · 2026/11/4 13:09:50

安卓智能语音对话机器人源码:唤醒识别到串口动作链路
安卓智能语音对话机器人源码:唤醒识别到串口动作链路

简介:智能语音对话机器人是一套面向安卓开发者与语音交互爱好者的完整项目源码,围绕语音识别、对话理解与机器人大脑接口展开,可用于学习如何把语音输入转为文本、再由自然语言处理生成应答,并驱动提醒、音乐、天气等日常功能。压… · 2026/11/4 13:09:50

Unity远距离贴图闪烁根因与Mipmap精准调优指南
Unity远距离贴图闪烁根因与Mipmap精准调优指南

1. 为什么远距离贴图闪烁不是“玄学”,而是Mipmap在敲门Unity里那个让人抓狂的场景——远处的墙面、地面、建筑表面突然像接触不良的旧电视一样“滋啦滋啦”闪动,颜色跳变、纹理撕裂、细节忽隐忽现,尤其在镜头缓慢平移或轻微晃动时最为明显。… · 2026/11/4 13:09:50

SQL实战案例:从基础查询到电商数据分析
SQL实战案例:从基础查询到电商数据分析

1. 项目概述:通过实例学习SQL与数据库 "Learn SQL and Database by Examples"这个标题直指一个核心痛点:大多数人在学习数据库技术时,最缺的不是理论知识,而是能立即上手的实战案例。我在过去十年带过无数数据分析团队&… · 2026/11/4 13:09:50

AGIBOT全球挑战赛:认知与具身智能技术解析
AGIBOT全球挑战赛:认知与具身智能技术解析

1. 赛事背景与核心价值解析 这个夏天,全球AI与机器人领域迎来一场重磅赛事——AGIBOT WORLD CHALLENGE以53万美金的高额奖金池震撼开赛。作为从业者,我第一时间研究了赛事白皮书,发现这远不止是一场普通的技术竞赛。赛事主办方通过双赛道设计… · 2026/11/4 13:09:50

因子分解机(FM)原理与推荐系统实战指南
因子分解机(FM)原理与推荐系统实战指南

1. 因子分解机(FM)概述 在推荐系统和机器学习领域,因子分解机(Factorization Machine,简称FM)是一种强大的预测模型,它通过引入特征交叉的隐向量内积来捕捉特征间的高阶交互关系。我第一次接触F… · 2026/11/4 13:08:49

双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试
双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/4 3:16:49

STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析
STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/4 6:59:29

DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案
DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/4 7:02:38

AI辅助技术栈评估:提升研发决策效率60%
AI辅助技术栈评估:提升研发决策效率60%

1. 项目背景与核心价值技术决策一直是研发团队面临的重大挑战。随着技术生态的快速演进,技术栈的选择、维护和迭代变得愈发复杂。我们团队在过去两年里,先后经历了三次重大技术栈迁移,每次都需要投入大量人力进行技术评估和风险分析。直到去年… · 2026/11/4 0:00:17

从生成Token到直接决策:Jev如何重塑AI Agent工程实践
从生成Token到直接决策:Jev如何重塑AI Agent工程实践

1. 从"生成文字"到"拍板决策":Jev 到底在解决什么问题大多数人第一次接触大模型,脑子里建立的模型是"输入问题、输出文字"。你问它今天天气怎么样,它给你一段描述;你让它写个周报,它给你… · 2026/11/4 0:00:17

32G统一内存跑大模型:内存账、TPS实测与端云分流
32G统一内存跑大模型:内存账、TPS实测与端云分流

想在一台 32G 统一内存的小主机上把大模型跑成"日常可用",这件事我前后折腾了小半年。标题里说的这台 Mac mini M6,是我们这次讨论的目标平台,具体到手规格以实物为准;但下面这套推算方法和实测思路,对任何统… · 2026/11/4 0:00:17

双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试
双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/4 3:16:49

STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析
STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/4 6:59:29

DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案
DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/4 7:02:38

了解更多?预约专属演示

我们的顾问将为您一对一讲解产品与方案

企业微信二维码