三个线程 a、b、c 并发运行,b,c 需要 a 线程的数据如何解决
说明: 开发中经常会碰到线程并发,但是后续线程需要等待第一个线程执行完返回结果后,才能再执行后面线程。
如何处理呢,今天就介绍两种方法
1、使用Java自有的API即CountDownLatch,进行实现
思考:CountDownLatch通过一个计数器来实现线程等待,计数器初始化为需要等待的事件数量。在这里,线程a完成后,b和c才能继续,所以计数器应该是1。当a完成数据准备后,调用countDown(),计数器减到0,这时候等待的b和c就可以继续执行了。
public class CountDownLatchDemo {// 定义共享数据(确保可见性,使用 volatile)private static volatile String data;// 初始化 CountDownLatch,计数器为 1(只需要等待线程 a 完成一次操作)private static final CountDownLatch latch = new CountDownLatch(1);public static void main(String[] args) {// 启动线程 a、b、cnew Thread(new Runnable() {public void run() {threadC();}}).start();new Thread(new Runnable() {public void run() {threadB();}}).start();new Thread(new Runnable() {public void run() {threadA();}}).start();}// 线程 a:准备数据private static void threadA() {try {// 模拟耗时操作(如计算、IO)Thread.sleep(1000);data = "来自线程 A 的数据";System.out.println("线程 A 数据准备完毕");} catch (InterruptedException e) {e.printStackTrace();} finally {// 数据就绪后,释放计数器latch.countDown();}}// 线程 b:等待数据后处理private static void threadB() {try {// 阻塞等待数据就绪latch.await();System.out.println("线程 B 收到数据: " + data);} catch (InterruptedException e) {e.printStackTrace();}}// 线程 c:等待数据后处理private static void threadC() {try {// 阻塞等待数据就绪latch.await();System.out.println("线程 C 收到数据: " + data);} catch (InterruptedException e) {e.printStackTrace();}}
}
运行结果:
2、使用kotlin协程的方式
思考:
协程 a 的异步执行:
1)使用 async 启动协程 a,返回一个 Deferred 对象(dataDeferred)。
2)在协程 a 中,通过 delay(1000) 模拟耗时操作,最终返回数据。
协程 b 和 c 的并发等待:
1)使用 launch 启动协程 b 和 c,它们会立即开始执行。
2)协程 b 和 c 调用 dataDeferred.await() 挂起自身,直到协程 a 的数据准备完毕。
数据共享与可见性:
1)Deferred 是 Kotlin 协程的轻量级并发原语,确保数据在协程间的安全传递。
2)await() 方法是非阻塞的,协程会在数据就绪后自动恢复执行。
import kotlinx.coroutines.*fun main() = runBlocking {// 协程 a 异步生成数据,返回 Deferred 对象val dataDeferred = async {delay(1000) // 模拟耗时操作(如计算、IO)"Data from Coroutine A"}// 启动协程 b 和 c,它们会并发执行并等待数据val jobB = launch {val data = dataDeferred.await() // 挂起直到数据就绪println("Coroutine B 处理数据: $data")}val jobC = launch {val data = dataDeferred.await() // 挂起直到数据就绪println("Coroutine C 处理数据: $data")}// 等待所有子协程完成joinAll(jobB, jobC)
}
相关文章:
三个线程 a、b、c 并发运行,b,c 需要 a 线程的数据如何解决
说明: 开发中经常会碰到线程并发,但是后续线程需要等待第一个线程执行完返回结果后,才能再执行后面线程。 如何处理呢,今天就介绍两种方法 1、使用Java自有的API即CountDownLatch,进行实现 思考:CountDown…...
python实现点餐系统
使用python实现点餐系统的增加菜品及价格,删除菜品,查询菜单,点菜以及会员折扣价等功能。 代码: 下面展示一些 内联代码片。 # coding utf-8menu {拍黄瓜: 6, 小炒肉: 28, 西红柿炒蛋: 18, 烤鱼: 30, 红烧肉: 38, 手撕鸡: 45,…...
力扣26——删除有序数组中的重复项
目录 1.题目描述: 2.算法分析: 3.代码展示: 1.题目描述: 给你一个 非严格递增排列 的数组 nums ,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。元素的 相对…...
A2A与MCP定义下,User,Agent,api(tool)间的交互流程图
官方图: 流程图: #mermaid-svg-2smjE8VYydjtLH0p {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-2smjE8VYydjtLH0p .error-icon{fill:#552222;}#mermaid-svg-2smjE8VYydjtLH0p .error-tex…...
【大模型面试每日一题】Day 13:数据并行与模型并行的区别是什么?ZeRO优化器如何结合二者?
【大模型面试每日一题】Day 13:数据并行与模型并行的区别是什么?ZeRO优化器如何结合二者? 📌 题目重现 🌟🌟 面试官:数据并行与模型并行的区别是什么?ZeRO优化器如何结合二者&…...
各种注解含义及使用
RestController RestController注解 是Spring 4.0引入的一个组合注解,用于简化RESTful Web服务的开发。 RestController注解 相当于 Controller 和 ResponseBody 注解的组合,表示该类是一个控制器,并且所有的方法返回值都将直接写入HTTP响应体…...
amass:深入攻击面映射和资产发现工具!全参数详细教程!Kali Linux教程!
简介 OWASP Amass 项目使用开源信息收集和主动侦察技术执行攻击面网络映射和外部资产发现。 此软件包包含一个工具,可帮助信息安全专业人员使用开源信息收集和主动侦察技术执行攻击面网络映射并执行外部资产发现。 使用的信息收集技术 技术数据来源APIs…...
xxl-job简单入门使用教程
1、从git中拉取xxl-job代码 https://gitee.com/xuxueli0323/xxl-job HTTPS:git clone https://gitee.com/xuxueli0323/xxl-job.git SSH:git clone gitgitee.com:xuxueli0323/xxl-job.git 拉取本地后,使用Idea打开项目,当前使用…...
设置GO程序在离线情况下读取本地缓存的模块
在 Go 中,GOPROXY 环境变量用于指定模块代理服务器的地址。如果你想让 GOPROXY 读取本地的模块,可以通过以下几种方式实现: 1. 使用本地代理服务器 你可以搭建一个本地的 Go 模块代理服务器,将需要的模块代码推送到代理服务器中…...
Python 爬虫基础入门教程(超详细)
一、什么是爬虫? 网络爬虫(Web Crawler),又称网页蜘蛛,是一种自动抓取互联网信息的程序。爬虫会模拟人的浏览行为,向网站发送请求,然后获取网页内容并提取有用的数据。 二、Python爬虫的基本原…...
C语言实现三子棋
目录 1.通过模块化来实现三子棋 2.三子棋代码基本逻辑 3.代码的书写 第一步: 第二步: 第三步: 第四步: gane.h gane.c main.c 第五步: game.h game.c main.c 第六步: game.h game.c main…...
SCDN是什么?
SCDN是安全内容分发网络的简称,它在传统内容分发网络(CDN)的基础上,集成了安全防护能力,旨在同时提升内容传输速度和网络安全性。 SCDN的核心功能有: DDoS防御:识别并抵御大规模分布式拒绝服务…...
Transformer编码器+SHAP分析,模型可解释创新表达!
目录 效果一览基本介绍程序设计参考资料 效果一览 基本介绍 基本介绍 基于SHAP分析的特征选择和贡献度计算,Matlab2023b代码实现;基于MATLAB的SHAP可解释Transformer编码器回归模型,敏感性分析方法。 详细介绍 引言 在正向渗透(…...
机器学习第三讲:监督学习 → 带答案的学习册,如预测房价时需要历史价格数据
机器学习第三讲:监督学习 → 带答案的学习册,如预测房价时需要历史价格数据 资料取自《零基础学机器学习》。 查看总目录:学习大纲 关于DeepSeek本地部署指南可以看下我之前写的文章:DeepSeek R1本地与线上满血版部署࿱…...
【TACD模拟】质子辐照对GaN器件临界电压增加的影响机制
2013 年,佛罗里达大学的 Erin Patrick 等人基于 TRIM 和 FLOODS 模型,研究了质子辐照对 AlGaN/GaN HEMTs 的影响。研究背景方面,AlGaN/GaN HEMTs 因其宽禁带、高击穿场、高电子迁移率以及优秀的热管理能力,在商业和军事领域应用前景广阔,但长期可靠性仍是问题,尤其是栅极…...
VBA高级应用30例应用4:利用屏蔽事件来阻止自动运行事件
《VBA高级应用30例》(版权10178985),是我推出的第十套教程,教程是专门针对高级学员在学习VBA过程中提高路途上的案例展开,这套教程案例与理论结合,紧贴“实战”,并做“战术总结”,以…...
基于SSM实现的健身房系统功能实现八
一、前言介绍: 1.1 项目摘要 随着社会的快速发展和人们健康意识的不断提升,健身行业也在迅速扩展。越来越多的人加入到健身行列,健身房的数量也在不断增加。这种趋势使得健身房的管理变得越来越复杂,传统的手工或部分自动化的管…...
Java设计模式之原型模式详解:从入门到精通
1. 原型模式概述 1.1 定义与核心概念 **原型模式(Prototype Pattern)**是一种创建型设计模式,它通过复制现有对象来创建新对象,而不是通过new关键字实例化。这种模式特别适用于创建成本较高的对象。 专业术语解释表: 术语解释原型(Prototype)被复制的原始对象克隆(Clone)…...
鞋样设计软件
Sxy 64鞋样设计软件是一款专业级鞋类设计工具 专为鞋业设计师与制鞋企业开发 该软件提供全面的鞋样设计功能 包括二维开版 三维建模 放码排料等核心模块 支持从草图构思到成品输出的完整设计流程 内置丰富的鞋型数据库与部件库 可快速生成各种鞋款模板 软件采用智能放码技术 精…...
移动IP与手机移动数据流量的概念、原理、区别与联系
移动IP与手机移动数据流量的概念、原理、区别与联系 文章目录 移动IP与手机移动数据流量的概念、原理、区别与联系一、概念与原理二、核心区别三、联系与协作四、技术挑战与发展趋势五、总结 一、概念与原理 移动IP 定义:移动IP是一种网络层协议,允许设…...
Spring中除DI之外获取 BEAN 的方式
前言 在 Spring 框架的开发实践中,获取 Bean 是极为重要的基础操作。我们熟知通过依赖注入能便捷地获取 Bean,不过在许多场景下,还需要借助其他方式来获取 Bean。本文将深入探讨在 Spring 中除了依赖注入之外获取 Bean 的多种方式,…...
屎上雕花系列-2nd
以下为“屎上雕花”的尝试2nd 使用Deepseek扩容而来,我竟然没有找到明显的错误,太强大了,工作改变生活了 LeCroy 以太网与 SAN 网络测试解决方案 硬件平台一:Xena 以太网流量生成器 Xena 以太网流量生成器是一款高性能的网络测…...
第十五章,SSL VPN
前言 IPSec 和 SSL 对比 IPSec远程接入场景---client提前安装软件,存在一定的兼容性问题 IPSec协议只能够对感兴趣的流量进行加密保护,意味着接入用户需要不停的调整策略,来适应IPSec隧道 IPSec协议对用户访问权限颗粒度划分的不够详细&…...
第四天 从CAN总线到Spark/Flink实时处理
前言 在智能网联汽车快速发展的今天,每辆汽车每天产生的数据量高达数GB。这些数据蕴藏着驾驶行为、车辆健康、道路状况等宝贵信息。本文将带您从零开始,系统学习车辆数据采集与分析的全流程技术体系,包含: CAN总线数据解析与采集…...
pandas中的数据聚合函数:`pivot_table` 和 `groupby`有啥不同?
pivot_table 和 groupby 是 pandas 中两种常用的数据聚合方法,它们都能实现数据分组和汇总,但在使用方式和输出结构上有显著区别。 0. 基本介绍 groupby分组聚合 groupby 是 Pandas 库中的一个功能强大的方法,用于根据一个或多个列对数据进…...
AI客服问答自动生成文章(基于deepseek实现)
小编一直在用AI做网站平台文章的润色或者二创。一直有一个想法,在自己网站加一个AI智能客服,通过文心或者deepseek来智能回答网友提出的问题,这样就能减少很多人工回复的麻烦,提高互动效率。 开发背景 其实很多网友提出的问题非…...
镜头内常见的马达类型(私人笔记)
① 螺杆式马达 驱动来源:机身内马达。镜头尾部有一个接收“螺杆”的接口,通过机械传动带动镜头对焦组。缺点:慢、吵、不能用于无机身马达的相机。✅ 典型镜头:尼康 AF、AF-D 系列;美能达老镜头。尼康传统的AF镜头通过…...
从 JMS 到 ActiveMQ:API 设计与扩展机制分析(一)
引言 在当今的分布式系统开发中,消息中间件扮演着举足轻重的角色,它为应用程序之间提供了可靠的异步通信机制。JMS(Java Message Service)作为 Java 平台上的消息服务规范,定义了一套通用的 API,使得开发者…...
第J7周:ResNeXt解析
🍨 本文为🔗365天深度学习训练营 中的学习记录博客🍖 原作者:K同学啊 目标 具体实现 (一)环境 语言环境:Python 3.10 编 译 器: PyCharm 框 架: Tensorflow (二)具体…...
机器学习-无量纲化与特征降维(一)
一.无量纲化-预处理 无量纲,即没有单位的数据 无量纲化包括"归一化"和"标准化",这样做有什么用呢?假设用欧式距离计算一个公司员工之间的差距,有身高(m)、体重(kg&#x…...
Shiro(八):JWT介绍
1、什么是JWT? JWT(JSON Web Token,JSON Web令牌)是一种开放标准(RFC 7519),用于在网络应 用环境间安全地传递声明(claims)作为JSON对象;JWT会按指定的加密算…...
linux0.11内核源码修仙传第十六章——获取硬盘信息
🚀 前言 书接第十四章:linux0.11内核源码修仙传第十四章——进程调度之fork函数,在这一节博客中已经通过fork进程创建了一个新的进程1,并且可以被调度,接下来接着主线继续走下去。希望各位给个三连,拜托啦&…...
画家沈燕的山水实验:在传统皴法里植入时代密码
导语:当宋代山水遇上AI算法,当青绿颜料邂逅生态数据,沈燕在宣纸与人工智能的交界处,开启了一场关于水墨基因的“基因突变”实验。她的画笔既似考古学家的洛阳铲,又似未来学家的扫描仪,在古今对话中重构山水…...
聊聊四种实时通信技术:短轮询、长轮询、WebSocket 和 SSE
这篇文章,我们聊聊 四种实时通信技术:短轮询、长轮询、WebSocket 和 SSE 。 1 短轮询 浏览器 定时(如每秒)向服务器发送 HTTP 请求,服务器立即返回当前数据(无论是否有更新)。 优点࿱…...
国联股份卫多多与北京经纬智诚签署战略合作协议
5月9日,北京经纬智诚电子商务有限公司(以下简称“经纬智诚”)总经理王学文一行到访国联股份卫多多,同卫多多/纸多多副总裁、产发部总经理段任飞,卫多多机器人产业链总经理郭碧波展开深入交流,双方就未来合作…...
在 Envoy 的配置文件中出现的 “@type“ 字段
在 Envoy 的配置文件中出现的 "type" 字段是 Protocol Buffers(Protobuf)的 JSON/YAML 编码规范的一部分,属于 Typed Struct 的表示方式。它的作用是明确指定当前配置对象的 Protobuf 类型,以便 Envoy 正确解析配置。以…...
编译原理实验 之 语法分析程序自动生成工具Yacc实验
文章目录 实验环境准备复现实验例子分析总的文件架构实验任务 什么是Yacc Yacc(Yet Another Compiler Compiler)是一个语法分析程序自动生成工具,Yacc实验通常是在编译原理相关课程中进行的实践项目,旨在让学生深入理解编译器的语法分析阶段以及掌握Yac…...
【大模型】LLM概念相关问题(上)
1.主流的大语言模型 截至2025年,主流的大型语言模型(LLM)体系涵盖了多个国家和机构的成果,具有多样的架构设计、参数规模和应用场景。以下是一些具有代表性的开源和闭源 LLM 体系: 🇺🇸 OpenA…...
AWS IoT Core与MSK集成实战:打造高可靠实时IoT数据管道
在物联网快速发展的今天,如何高效、安全地处理海量设备数据成为企业面临的一大挑战。本文将带您深入探索AWS IoT Core与Amazon MSK(Managed Streaming for Apache Kafka)的集成方案,手把手教您搭建一个可靠、可扩展的实时IoT数据处理管道。无论您是IoT开发者、大数据工程师还是…...
智慧交通-车门开关状态检测数据集VOC+YOLO格式1006张2类
数据集格式:Pascal VOC格式YOLO格式(不包含分割路径的txt文件,仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数):1006 标注数量(xml文件个数):1006 标注数量(txt文件个数):1006 …...
【传感器】代码——DHT11温湿度传感器
目录 一、代码流程 二、模块.c代码 三、模块.h代码 四、主函数代码 一、代码流程 1.模块复位:主机发送开始通信时序,从机做出响应(需检测是否有响应) 2.MCU读取1Bit数据 3.MCU读取1Byte数据 4.MCU读取8Byte数据组成完整Dat…...
MySQL 的事务(Transaction)
1. 什么是事务? 事务是一组原子性的数据库操作序列,这些操作要么全部执行成功,要么全部失败回滚。事务的目的是确保数据库从一个一致状态转换到另一个一致状态,即使在执行过程中发生错误或中断。 …...
vue知识点总结 依赖注入 动态组件 异步加载
一 依赖注入 使用场景:当需要多层组件需要传值 如 祖宗-》父亲-》儿子-》孙子如祖宗的数据需要直接传给孙子 在祖宗组件中写: data(){return {}} provide(){ return {shujukey:数据值 } }在孙子组件中接收,模板代码中直接使用{{shujukey}}获取数据 dat…...
【软件设计师:存储】16.计算机存储系统
一、主存储器 存储器是计算机系统中的记忆设备,用来存放程序和数据。 计算机中全部信息,包括输入的原始数据、计算机程序、中间运 行结果和最终运行结果都保存在存储器中。 存储器分为: 寄存器Cache(高速缓冲存储器)主存储器辅存储器一、存储器的存取方式 二、存储器的性…...
快速开发-基于gin的中间件web项目开发
一、概述 在 Gin 框架中,中间件(Middleware)是一种在处理 HTTP 请求之前或之后执行的函数。使用中间件可以方便地实现诸如身份验证(Auth)、日志记录、请求限流等功能。 二、编写中间件 // 中间件 func StartCost1(c …...
耀圣-气动带刮刀硬密封法兰球阀:攻克颗粒高粘度介质的自清洁 “利器”
气动带刮刀硬密封法兰球阀:攻克颗粒高粘度介质的自清洁 “利器” 在化工、矿业、食品加工等行业中,带颗粒高粘度介质、料浆及高腐蚀性介质的输送与控制一直是行业难题。普通阀门极易因介质附着、颗粒堆积导致卡阻失效,密封面磨损加剧&#x…...
MySQL + Elasticsearch:为什么要使用ES,使用场景与架构设计详解
MySQL Elasticsearch:为什么要使用ES,使用场景与架构设计详解 前言一、MySQL Elasticsearch的背景与需求1.1 为什么要使用Elasticsearch(ES)?1.2 为什么MySQL在某些场景下不足以满足需求?1.3 MySQL Elas…...
【C语言】--指针超详解(三)
目录 一.数组名的理解 二.使用指针访问数组 三.一维数组传参的本质 四.冒泡排序 五.二级指针 六.指针数组 6.1--指针数组的定义 6.2--指针数组模拟二维数组 🔥个人主页:草莓熊Lotso的个人主页 🎬作者简介:C方向学习者 &…...
污水处理厂逆袭:Ethernet/IP 转 CANopen 开启“智净”时代
在我们的日常生活中,污水处理厂发挥着至关重要的作用,它们处理着城市污水,确保我们的水源安全。然而,这些关键设施的运行和管理并非易事,尤其是在数字化转型的大潮中。现在,我们有了一款创新的解决方案——…...
ROS导航局部路径规划算法
在导航功能包中,局部路径规划器的位置如图红框所示。它接受全局路径规划器生成的全局路径以及里程计信息和局部代价地图,最后输出速度控制信息 一、DWA(Dynamic Window Approach) 原理介绍 DWA 是一种基于动态窗口采样的局部路…...