news 2026/11/3 9:20:08

【Java异步编程】CompletableFuture综合实战:泡茶喝水与复杂的异步调用

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
【Java异步编程】CompletableFuture综合实战:泡茶喝水与复杂的异步调用

文章目录

    • 一. 两个异步任务的合并:泡茶喝水
    • 二. 复杂的异步调用:结果依赖,以及异步执行调用等

一. 两个异步任务的合并:泡茶喝水

下面的代码中我们实现泡茶喝水。这里分3个任务:任务1负责洗水壶、烧开水,任务2负责洗茶壶、洗茶杯和拿茶叶,任务3负责泡茶。其中任务3要等待任务1和任务2都完成后才能开始。

publicclassDrinkTea{privatestaticfinalintSLEEP_GAP=3;//等待3秒publicstaticvoidmain(String[]args){// 异步任务1CompletableFuture<Boolean>washJob=CompletableFuture.supplyAsync(()->{Print.tcfo("洗茶杯");//线程睡眠一段时间,代表清洗中sleepSeconds(SLEEP_GAP);Print.tcfo("洗完了");returntrue;});// 异步任务2CompletableFuture<Boolean>hotJob=CompletableFuture.supplyAsync(()->{Print.tcfo("洗好水壶");Print.tcfo("烧开水");//线程睡眠一段时间,代表烧水中sleepSeconds(SLEEP_GAP);Print.tcfo("水开了");returntrue;});// 等待任务1,2执行完成后,任务3执行thenCombineCompletableFuture<String>drinkJob=//hotOk、washOK,指的是两个异步任务的返回结果washJob.thenCombine(hotJob,(hotOk,washOK)->{if(hotOk&&washOK){Print.tcfo("泡茶喝,茶喝完");return"茶喝完了";}return"没有喝到茶";});// 阻塞主线程:等待任务 3 执行结果Print.tco(drinkJob.join());}

执行日志:

[ForkJoinPool.commonPool-worker-9|DrinkTea.lambda$main$0]:洗茶杯 [ForkJoinPool.commonPool-worker-2|DrinkTea.lambda$main$1]:洗好水壶 [ForkJoinPool.commonPool-worker-2|DrinkTea.lambda$main$1]:烧开水 [ForkJoinPool.commonPool-worker-9|DrinkTea.lambda$main$0]:洗完了 [ForkJoinPool.commonPool-worker-2|DrinkTea.lambda$main$1]:水开了 [ForkJoinPool.commonPool-worker-9|DrinkTea.lambda$main$2]:泡茶喝,茶喝完 [main]:茶喝完了 JVM退出钩子(定时和顺序任务线程池) starting.... JVM退出钩子(定时和顺序任务线程池) 耗时(ms): 1

通过整体的执行过程可以发现:

  1. 给任务分配线程的工作由线程池自动完成。
  2. 任务之间的依赖关系一目了然。以下面的伪代码为例:
job3=job1.thenCombine(job2,(result1,result2)->{回调逻辑})

等待任务1,2执行完成后,任务3执行thenCombine,其中result1、result2是任务1、任务2的返回值。基于两个异步任务的返回值判断是否进行泡茶喝。

  1. join: 阻塞主线程:等待任务 3 执行结果

参考:《Java高并发核心编程》-尼恩

二. 复杂的异步调用:结果依赖,以及异步执行调用等

具体代码查看gitee提交:[并发编程]CompletableFuture实现复杂的异步调用:结果依赖,以及异步执行调用等

具体实现了:

  1. 通过策略模式,实现了流程下各个执行逻辑
  2. 通过使用CompletableFuture实现各执行逻辑异步执行
  3. 通过使用thenRunAsync等待前面步骤执行,进而实现5,6步的异步执行,加快执行速度
  4. 使用CompletableFuture.allOf(step5, step6),合并5,6步的结果。
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/11/3 9:19:18

Z2400027基于Java+SpringBoot+Mysql+thymeleaf引擎的图书馆管理系统的设计与实现 代码 论文

图书馆管理系统的设计与实现一、项目背景与简介二、系统总体功能三、运行环境与技术选型四、系统架构与模块划分五、系统界面截图六、源码获取一、项目背景与简介 项目背景&#xff1a; 随着信息技术的不断发展和图书资源的日益丰富&#xff0c;图书馆作为知识传播和学习的重要…

作者头像 李华
网站建设 2026/11/3 9:17:16

Motif-Video-2B实战应用:10个创意视频生成案例分享

Motif-Video-2B实战应用&#xff1a;10个创意视频生成案例分享 Motif-Video-2B是一款强大的AI视频生成工具&#xff0c;能够帮助用户轻松创建高质量视频内容。本文将分享10个创意视频生成案例&#xff0c;展示该工具在不同场景下的应用效果&#xff0c;让你快速掌握视频创作的新…

作者头像 李华
网站建设 2026/11/3 9:16:50

【docker】docker常见命令

/* 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 9:14:44

解决LTX-Best-Face-ID常见问题:从安装错误到人脸模糊的完整解决方案

解决LTX-Best-Face-ID常见问题&#xff1a;从安装错误到人脸模糊的完整解决方案 LTX-Best-Face-ID是一款基于LTX-2.3模型的身份保留参考视频生成LoRA插件&#xff0c;它能通过一张参考照片和文本提示生成保持人物身份的视频。本文将针对使用过程中可能遇到的安装错误、人脸模糊…

作者头像 李华
网站建设 2026/11/3 9:14:39

【Docker深入浅出】【四】单体应用容器化与Dockerfile怎么写

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

作者头像 李华