【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
通过整体的执行过程可以发现:
- 给任务分配线程的工作由线程池自动完成。
- 任务之间的依赖关系一目了然。以下面的伪代码为例:
job3 = job1.thenCombine( job2, (result1, result2)->{回调逻辑})
等待任务1,2执行完成后,任务3执行thenCombine,其中result1、result2是任务1、任务2的返回值。基于两个异步任务的返回值判断是否进行泡茶喝。
- join: 阻塞主线程:等待任务 3 执行结果
参考:《Java高并发核心编程》-尼恩
二. 复杂的异步调用:结果依赖,以及异步执行调用等
具体代码查看gitee提交:[并发编程]CompletableFuture实现复杂的异步调用:结果依赖,以及异步执行调用等
具体实现了:
- 通过策略模式,实现了流程下各个执行逻辑
- 通过使用CompletableFuture实现各执行逻辑异步执行
- 通过使用thenRunAsync等待前面步骤执行,进而实现5,6步的异步执行,加快执行速度
- 使用CompletableFuture.allOf(step5, step6),合并5,6步的结果。
相关文章:
【Java异步编程】CompletableFuture综合实战:泡茶喝水与复杂的异步调用
文章目录 一. 两个异步任务的合并:泡茶喝水二. 复杂的异步调用:结果依赖,以及异步执行调用等 一. 两个异步任务的合并:泡茶喝水 下面的代码中我们实现泡茶喝水。这里分3个任务:任务1负责洗水壶、烧开水,任…...
Nginx知识
nginx 精简的配置文件 worker_processes 1; # 可以理解为一个内核一个worker # 开多了可能性能不好events {worker_connections 1024; } # 一个 worker 可以创建的连接数 # 1024 代表默认一般不用改http {include mime.types;# 代表引入的配置文件# mime.types 在 ngi…...
Unity开发游戏使用XLua的基础
Unity使用Xlua的常用编码方式,做一下记录 1、C#调用lua 1、Lua解析器 private LuaEnv env new LuaEnv();//保持它的唯一性void Start(){env.DoString("print(你好lua)");//env.DoString("require(Main)"); 默认在resources文件夹下面//帮助…...
AI-ISP论文Learning to See in the Dark解读
论文地址:Learning to See in the Dark 图1. 利用卷积网络进行极微光成像。黑暗的室内环境。相机处的照度小于0.1勒克斯。索尼α7S II传感器曝光时间为1/30秒。(a) 相机在ISO 8000下拍摄的图像。(b) 相机在ISO 409600下拍摄的图像。该图像存在噪点和色彩偏差。©…...
OpenCV:开运算
目录 1. 简述 2. 用腐蚀和膨胀实现开运算 2.1 代码示例 2.2 运行结果 3. 开运算接口 3.1 参数详解 3.2 代码示例 3.3 运行结果 4. 开运算应用场景 5. 注意事项 6. 总结 相关阅读 OpenCV:图像的腐蚀与膨胀-CSDN博客 OpenCV:闭运算-CSDN博客 …...
38. RTC实验
一、RTC原理详解 1、6U内部自带到了一个RTC外设,确切的说是SRTC。6U和6ULL的RTC内容在SNVS章节。6U的RTC分为LP和HP。LP叫做SRTC,HP是RTC,但是HP的RTC掉电以后数据就丢失了,即使用了纽扣电池也没用。所以必须要使用LP,…...
Flutter 新春第一弹,Dart 宏功能推进暂停,后续专注定制数据处理支持
在去年春节,Flutter 官方发布了宏(Macros)编程的原型支持, 同年的 5 月份在 Google I/O 发布的 Dart 3.4 宣布了宏的实验性支持,但是对于 Dart 内部来说,从启动宏编程实验开始已经过去了几年,但…...
巴菲特价值投资思想的核心原则
巴菲特价值投资思想的核心原则 关键词:安全边际、长期投资、内在价值、管理团队、经济护城河、简单透明 摘要:本文深入探讨了巴菲特价值投资思想的核心原则,包括安全边际、长期投资、企业内在价值、优秀管理团队、经济护城河和简单透明的业务…...
C 或 C++ 中用于表示常量的后缀:1ULL
1ULL 是一个在 C 或 C 中用于表示常量的后缀,它具体指示编译器将这个数值视为特定类型的整数。让我们详细解释一下: 1ULL 的含义 1: 这是最基本的部分,表示数值 1。U: 表示该数值是无符号(Unsigned)的。这意味着它只…...
vue3中el-input无法获得焦点的问题
文章目录 现象两次nextTick()加setTimeout()解决结论 现象 el-input被外层div包裹了,设置autofocus不起作用: <el-dialog v-model"visible" :title"title" :append-to-bodytrue width"50%"><el-form v-model&q…...
程序诗篇里的灵动笔触:指针绘就数据的梦幻蓝图<3>
大家好啊,我是小象٩(๑ω๑)۶ 我的博客:Xiao Xiangζั͡ޓއއ 很高兴见到大家,希望能够和大家一起交流学习,共同进步。 今天我们来对上一节做一些小补充,了解学习一下assert断言,指针的使用和传址调用…...
(三)QT——信号与槽机制——计数器程序
目录 前言 信号(Signal)与槽(Slot)的定义 一、系统自带的信号和槽 二、自定义信号和槽 三、信号和槽的扩展 四、Lambda 表达式 总结 前言 信号与槽机制是 Qt 中的一种重要的通信机制,用于不同对象之间的事件响…...
Qt 5.14.2 学习记录 —— 이십이 QSS
文章目录 1、概念2、基本语法3、给控件应用QSS设置4、选择器1、子控件选择器2、伪类选择器 5、样式属性box model 6、实例7、登录界面 1、概念 参考了CSS,都是对界面的样式进行设置,不过功能不如CSS强大。 可通过QSS设置样式,也可通过C代码…...
Hot100之哈希
1两数之和 题目 思路解析 解法1--两次循环 解法2--哈希表一次循环 代码 解法1--两次循环 class Solution {public int[] twoSum(int[] nums, int target) {int nums1[] new int[2];int length nums.length;for (int i 0; i < length; i) {for (int j i 1; j < …...
油漆面积——蓝桥杯
1.题目描述 X 星球的一批考古机器人正在一片废墟上考古。 该区域的地面坚硬如石、平整如镜。 管理人员为方便,建立了标准的直角坐标系。 每个机器人都各有特长、身怀绝技。它们感兴趣的内容也不相同。 经过各种测量,每个机器人都会报告一个或多个矩…...
深度解析:网站快速收录与服务器性能的关系
本文转自:百万收录网 原文链接:https://www.baiwanshoulu.com/37.html 网站快速收录与服务器性能之间存在着密切的关系。服务器作为网站运行的基础设施,其性能直接影响到搜索引擎对网站的抓取效率和收录速度。以下是对这一关系的深度解析&am…...
925.长按键入
目录 一、题目二、思路三、解法四、收获 一、题目 你的朋友正在使用键盘输入他的名字 name。偶尔,在键入字符 c 时,按键可能会被长按,而字符可能被输入 1 次或多次。 你将会检查键盘输入的字符 typed。如果它对应的可能是你的朋友的名字&am…...
JavaScript 中的 var 和 let :关键区别与使用建议
在 JavaScript 开发中,变量声明是基础且重要的部分。 var 和 let 都是用于声明变量的关键字,但它们在作用域、变量提升、重复声明等方面存在显著差异。本文将详细探讨它们的区别,并给出使用建议。 1. 作用域 1.1 var 的作用域 …...
寒假刷题Day19
一、923. 三数之和的多种可能 class Solution { public:int threeSumMulti(vector<int>& arr, int target) {const int MOD 1000000007; // 正确的模数long long ans 0; // 使用 long long 防止溢出std::sort(arr.begin(), arr.end());for (size_t i 0; i < a…...
写好简历的三个关键认知
在当今竞争激烈的就业市场中,一份优秀的简历往往是敲开理想企业大门的第一把钥匙。然而,很多求职者在写简历时往往不得要领,让宝贵的机会从指间溜走。今天,让我们一起探讨如何提升简历写作水平,让你的职业之路走得更顺…...
Aura包管理器与Faur元数据服务器:了解Arch Linux包管理的终极解决方案
Aura包管理器与Faur元数据服务器:了解Arch Linux包管理的终极解决方案 【免费下载链接】aura A multilingual package manager for Arch Linux and the AUR. 项目地址: https://gitcode.com/gh_mirrors/aur/aura Aura是一个多语言包管理器,专为Ar…...
OpenArk:Windows系统安全检测的终极完整解决方案指南 [特殊字符]️
OpenArk:Windows系统安全检测的终极完整解决方案指南 🛡️ 【免费下载链接】OpenArk The Next Generation of Anti-Rookit(ARK) tool for Windows. 项目地址: https://gitcode.com/GitHub_Trending/op/OpenArk OpenArk是一款强大的Windows开源反R…...
Python使用Matplotlib绘制基础可视化图表
在Python中进行数据可视化,最常用且功能强大的库是 Matplotlib。它可以帮助你轻松绘制出柱状图、折线图、饼图、散点图、直方图、箱线图、热力图、雷达图等。在开始之前,请确保你已经安装了Matplotlib库。如果没有,可以在终端或命令行中运行以…...
Java 注解底层原理、组合注解实现与 AOP 协同机制全解析
Java 注解底层原理与 AOP 协同工作机制 系统性总结 本文严格基于 Java 注解底层原理及 AOP 结合使用的核心技术论述,对知识点进行系统性梳理、重组与优化。全文遵循元注解构建组合注解 → 注解编译与运行底层机制 → 注解AOP 协同工作原理 → 实战问题与解决方案的逻…...
用 LangChain 克隆一个 ChatGPT:LLMChain + Memory 实战
0 前言 ChatGPT 之所以好用,核心在于: 个性化的系统提示词多轮对话记忆 本文基于 LangChain,用不到 30 行代码复刻这两个能力,构建一个可自定义人格的对话 AI。 1 技术栈组件说明LLMChainLangChain 的核心链,将 LLM、P…...
安全测试人员必备:手把手教你用WePE+Ghost镜像在VMware里快速部署Win7靶机环境
安全测试人员必备:手把手教你用WePEGhost镜像在VMware里快速部署Win7靶机环境 在网络安全学习和渗透测试领域,拥有一个随时可用的标准化测试环境至关重要。对于刚入门的安全研究员、白帽子或需要进行漏洞复现的技术人员来说,Windows 7系统仍然…...
如何快速掌握TreeViewer:系统发育树可视化工具的完整指南
如何快速掌握TreeViewer:系统发育树可视化工具的完整指南 【免费下载链接】TreeViewer Cross-platform software to draw phylogenetic trees 项目地址: https://gitcode.com/gh_mirrors/tr/TreeViewer TreeViewer是一款功能强大的跨平台系统发育树可视化软件…...
航空航天装备行业技术岗结构设计工程师晋升CTO
下面我直接给你:航空航天装备行业「结构设计工程师 → CTO」的完整岗位链 每级年限 薪资(军工院所 vs 商业航天 2026 实价) 关键跃迁点,全部按结构岗真实晋升路线写死,不掺虚的。一、总路线(结构工程师 →…...
独立开发者如何借助多模型选型能力为产品选择最佳AI引擎
🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 独立开发者如何借助多模型选型能力为产品选择最佳AI引擎 对于独立开发者而言,为产品选择一个合适的AI模型引擎是一项关…...
AI代理如何革新领导力评估:从隐藏档案任务到低成本高效测量
1. 项目概述:当AI成为你的“面试官”,领导力评估正在发生什么?如果你是一位人力资源总监,或者是一位正在为团队选拔继任者而头疼的部门负责人,那么下面这个场景你一定不陌生:为了评估一个候选人的真实领导潜…...
