当前位置: 首页 > news >正文

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

文章目录

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

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

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

public class DrinkTea {private static final int SLEEP_GAP = 3;//等待3秒public static void main(String[] args) {// 异步任务1CompletableFuture<Boolean> washJob = CompletableFuture.supplyAsync(() ->{Print.tcfo("洗茶杯");//线程睡眠一段时间,代表清洗中sleepSeconds(SLEEP_GAP);Print.tcfo("洗完了");return true;});// 异步任务2CompletableFuture<Boolean> hotJob = CompletableFuture.supplyAsync(() ->{Print.tcfo("洗好水壶");Print.tcfo("烧开水");//线程睡眠一段时间,代表烧水中sleepSeconds(SLEEP_GAP);Print.tcfo("水开了");return true;});// 等待任务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步的结果。
http://www.lryc.cn/news/529906.html

相关文章:

  • Nginx知识
  • Unity开发游戏使用XLua的基础
  • AI-ISP论文Learning to See in the Dark解读
  • OpenCV:开运算
  • 38. RTC实验
  • Flutter 新春第一弹,Dart 宏功能推进暂停,后续专注定制数据处理支持
  • 巴菲特价值投资思想的核心原则
  • C 或 C++ 中用于表示常量的后缀:1ULL
  • vue3中el-input无法获得焦点的问题
  • 程序诗篇里的灵动笔触:指针绘就数据的梦幻蓝图<3>
  • (三)QT——信号与槽机制——计数器程序
  • Qt 5.14.2 学习记录 —— 이십이 QSS
  • Hot100之哈希
  • 油漆面积——蓝桥杯
  • 深度解析:网站快速收录与服务器性能的关系
  • 925.长按键入
  • JavaScript 中的 var 和 let :关键区别与使用建议
  • 寒假刷题Day19
  • 写好简历的三个关键认知
  • 工具的应用——安装copilot
  • Koa 基础篇(二)—— 路由与中间件
  • 帆软 FCA -业务分析师认证学习
  • Miniconda 安装及使用
  • solidity高阶 -- Eth支付
  • 深入理解Java中的String
  • 洛谷 P1734 最大约数和 C语言
  • Golang 执行流程分析
  • python学opencv|读取图像(五十一)使用修改图像像素点上BGR值实现图像覆盖效果
  • Flask数据的增删改查(CRUD)_flask删除数据自动更新
  • kamailio-ACC模块介绍【kamailio6.0. X】