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

【异步编程】CompletableFuture:异步任务的选择(执行最快的)执行

发布时间:2026/11/3 1:23:13 来源:云帆数科 栏目:资讯中心
【异步编程】CompletableFuture:异步任务的选择(执行最快的)执行
文章目录一. applyToEither : 拿到第一个任务结束的结果二. runAfterEither 第一个任务完成后执行副作用三. acceptEither消费第一个任务的结果四. 三种接口总结对于两个异步任务我们有时希望在其中一个任务完成时立即执行某些操作而不必等待其他任务的完成。为了实现这一需求CompletionStage提供了几个有用的方法其中包括applyToEither()、runAfterEither()和acceptEither()。CompletableFuture对异步任务的选择执行不是按照某种条件进行选择的而是按照执行速度进行选择的前面两个并行任务谁的结果返回速度快谁的结果将作为第三步任务的输入。一. applyToEither : 拿到第一个任务结束的结果applyToEither()方法允许我们在两个异步任务中选择一个已经完成的任务并对其结果应用一个函数。无论哪个任务先完成都会执行传入的Function操作并返回一个新的CompletableFuture。方法签名publicUCompletableFutureUapplyToEither(CompletionStage?extendsTother,Function?superT,?extendsUfn)-**other**另一个 CompletionStage与当前任务并行执行。-**fn**(两个任务中)当第一个任务完成时应用的函数。使用场景applyToEither()方法非常适合于需要在多个异步任务中选择一个最快完成的任务结果并进行处理的场景。示例代码TestpublicvoidapplyToEitherDemo2()throwsException{CompletableFutureIntegerfuture1CompletableFuture.supplyAsync(()-{try{Thread.sleep(500);}catch(InterruptedExceptione){Thread.currentThread().interrupt();}return2;});CompletableFutureIntegerfuture2CompletableFuture.supplyAsync(()-{try{Thread.sleep(100);}catch(InterruptedExceptione){Thread.currentThread().interrupt();}return3;});CompletableFutureIntegerresultfuture1.applyToEither(future2,(result1)-{System.out.println(第一个完成的任务的结果: result1);returnresult1*2;// 对结果进行处理});Integerintegerresult.get();System.out.println(integer);}分析future1和future2两个异步任务并行执行。applyToEither()会选择第一个完成的任务并将其结果传递给fn这里是对结果进行乘以 2 的操作。如果future2完成更快如上例中的500ms则会输出第一个完成的任务的结果: 3并返回6。二. runAfterEither 第一个任务完成后执行副作用runAfterEither()方法与applyToEither()类似但它不关心任务的结果。它只在其中一个任务完成时执行一个没有返回值的操作。它适用于需要在多个任务中选择一个最先完成的任务并执行某个副作用操作如打印日志、更新状态等的场景。方法签名publicCompletableFutureVoidrunAfterEither(CompletionStage?other,Runnableaction)-**other**另一个 CompletionStage。-**action**当第一个任务完成时执行的 Runnable 操作。-**返回类型**返回一个新的 CompletableFutureVoid表示操作完成。使用场景runAfterEither()方法适用于当你只关心某个任务完成后执行某些副作用操作而不需要处理任务的结果时。示例代码Testpublicvoidtest(){CompletableFutureIntegerfuture1CompletableFuture.supplyAsync(()-{try{Thread.sleep(1000);}catch(InterruptedExceptione){Thread.currentThread().interrupt();}return2;});CompletableFutureIntegerfuture2CompletableFuture.supplyAsync(()-{try{Thread.sleep(500);}catch(InterruptedExceptione){Thread.currentThread().interrupt();}return3;});future1.runAfterEither(future2,()-System.out.println(第一个完成的任务已经结束));}分析future1和future2分别执行两个异步任务。runAfterEither()会在第一个任务完成后执行Runnable操作这里是打印第一个完成的任务已经结束。无论哪个任务先完成都会触发打印操作而不关心它们的计算结果。三. acceptEither消费第一个任务的结果acceptEither()方法与applyToEither()方法类似不同之处在于它接受一个BiConsumer来消费完成任务的结果而不是返回一个新的CompletableFuture。该方法适用于只需要消费结果的场景。方法签名publicvoidacceptEither(CompletionStage?extendsTother,Consumer?superTaction)-**other**另一个 CompletionStage。-**action**当第一个任务完成时执行的 Consumer 操作。-**返回类型**该方法没有返回值它会直接消费任务的结果。使用场景acceptEither()方法适用于当我们只关心任务的结果并需要消费如打印、记录日志等时但不需要返回任何新的CompletableFuture。示例代码Testpublicvoidtest2(){CompletableFutureIntegerfuture1CompletableFuture.supplyAsync(()-{try{Thread.sleep(1000);}catch(InterruptedExceptione){Thread.currentThread().interrupt();}return2;});CompletableFutureIntegerfuture2CompletableFuture.supplyAsync(()-{try{Thread.sleep(500);}catch(InterruptedExceptione){Thread.currentThread().interrupt();}return3;});//使用 join() 阻塞直到操作完成future1.acceptEither(future2,(result)-System.out.println(第一个完成的任务的结果: result)).join();}**分析**-future1 和 future2 分别执行异步任务。-acceptEither() 会选择第一个完成的任务并将其结果传递给 Consumer 进行处理。在这里我们将结果打印出来。-输出会是 第一个完成的任务的结果: 3因为 future2 在500ms时先完成。在测试代码中通常会使用join()来确保异步任务完成后主线程再退出避免出现异步回调没有被执行的情况。四. 三种接口总结applyToEither()在两个异步任务中选择一个最先完成的任务并对其结果应用一个函数返回一个新的CompletableFuture。runAfterEither()在两个任务中选择一个最先完成的任务不关心任务的结果只执行一个Runnable操作。acceptEither()在两个任务中选择一个最先完成的任务并对其结果执行一个Consumer操作适用于消费任务的结果。这三个方法提供了灵活的工具可以帮助我们在多个并行任务中选择一个最先完成的任务并根据需求对其结果进行处理或执行副作用操作。掌握这些方法可以让我们更高效地进行异步编程和任务调度。

相关推荐

PP-LCNet_x1_0_table_cls_onnx预处理流程揭秘:从Resize到Normalize的5个关键步骤
PP-LCNet_x1_0_table_cls_onnx预处理流程揭秘:从Resize到Normalize的5个关键步骤

PP-LCNet_x1_0_table_cls_onnx预处理流程揭秘:从Resize到Normalize的5个关键步骤 想要快速掌握PP-LCNet_x1_0表格分类模型的预处理技巧吗?🤔 作为飞桨PaddlePaddle轻量级卷积网络在表格分类任务上的ONNX实现,PP-LCNet_x1_0_table_… · 2026/11/3 1:22:13

企业级OCR部署:飞桨PP-OCRv5移动端识别ONNX模型部署的3个关键挑战与解决方案
企业级OCR部署:飞桨PP-OCRv5移动端识别ONNX模型部署的3个关键挑战与解决方案

企业级OCR部署:飞桨PP-OCRv5移动端识别ONNX模型部署的3个关键挑战与解决方案 飞桨PP-OCRv5移动端识别ONNX模型(ta_PP-OCRv5_mobile_rec_onnx)是PaddlePaddle飞桨框架针对移动端优化的高性能OCR识别模型,通过ONNX格式实现了跨平台… · 2026/11/3 1:22:13

10个SLANeXt_wired_onnx实战技巧:提升表格识别准确率
10个SLANeXt_wired_onnx实战技巧:提升表格识别准确率

10个SLANeXt_wired_onnx实战技巧:提升表格识别准确率 想要在文档数字化和数据分析中高效处理表格数据吗?SLANeXt_wired_onnx作为飞桨PaddlePaddle推出的先进表格识别模型,能够将复杂的表格图像精准转换为结构化HTML格式。无论你是处理财务报… · 2026/11/3 1:22:13

CogAgent 9B:AI精准操控GUI界面的终极工具
CogAgent 9B:AI精准操控GUI界面的终极工具

CogAgent 9B:AI精准操控GUI界面的终极工具 导语:基于GLM-4V-9B大模型优化而来的CogAgent 9B正式发布,凭借在GUI感知、操作预测和跨平台适配能力的突破性提升,重新定义了AI驱动的图形界面自动化交互标准。 行业现状:从… · 2026/11/3 1:59:19

【深度学习-实验】花卉识别:用少量数据构建多分类系统的设计思路
【深度学习-实验】花卉识别:用少量数据构建多分类系统的设计思路

/* 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 1:59:19

StepVideo-T2V-Turbo:15步生成204帧视频的AI新突破
StepVideo-T2V-Turbo:15步生成204帧视频的AI新突破

StepVideo-T2V-Turbo:15步生成204帧视频的AI新突破 导语:AI视频生成技术迎来效率革命——StepVideo-T2V-Turbo模型实现仅需15步扩散即可生成204帧高质量视频,将文本到视频的创作效率提升3倍以上。 行业现状:从"能生成"… · 2026/11/3 1:59:19

Prometheus+Grafana监控
Prometheus+Grafana监控

部署根目录:/home/ops_app_user/middleware/prometheus 一、部署概述 1.1 适用场景 单业务服务器/小规模集群的主机系统、Docker容器、MySQL数据库、Redis缓存一体化监控,满足生产环境持久化、权限管控、告警预留、可维护性要求。 1.2 组件清单&#xff… · 2026/11/3 1:59:19

【51】番茄成熟度数据集(有v5/v8模型)/YOLO番茄成熟度检测
【51】番茄成熟度数据集(有v5/v8模型)/YOLO番茄成熟度检测

/* 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 1:59:19

《潜意识之门(三)》生生不息催眠的三大核心原则:将问题转化为资源的智慧
《潜意识之门(三)》生生不息催眠的三大核心原则:将问题转化为资源的智慧

/* 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 1:58:19

双极步进电机控制实战: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/2 13:10:28

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/2 4:42:45

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/2 5:17:18

STM32F411RE与MAX14431实现SPI隔离:工业现场抗共模干扰实战
STM32F411RE与MAX14431实现SPI隔离:工业现场抗共模干扰实战

/* 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 1:01:59

ESP32+大模型AI硬件开发:从Demo到产品的8个工程问题
ESP32+大模型AI硬件开发:从Demo到产品的8个工程问题

/* 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 1:01:59

基于MAX14431BAEE+与PIC18F85J10的SPI隔离方案设计与实践
基于MAX14431BAEE+与PIC18F85J10的SPI隔离方案设计与实践

/* 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 1:01:59

双极步进电机控制实战: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/2 13:10:28

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/2 4:42:45

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/2 5:17:18

了解更多?预约专属演示

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

企业微信二维码