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

三个线程 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)
}
http://www.xdnf.cn/news/5028.html

相关文章:

  • 虚假AI工具通过Facebook广告传播新型Noodlophile窃密木马
  • 具身智能时代的机器人导航和操作仿真器综述
  • MySQL 8.0(主从复制)
  • Linux 内核中的 security_sk_free:安全模块与 Socket 释放机制解析
  • 02_线性模型(回归线性模型)
  • 图像匹配导航定位技术 第 10 章
  • 创始人 IP 的破局之道:从技术突围到生态重构的时代启示|创客匠人评述
  • Skype已停服!
  • 文件包含2
  • 人工智能基础知识笔记八:数据预处理
  • 【K8S系列】Kubernetes常用 命令
  • Java学习手册:单体架构到微服务演进
  • PCA降维
  • Linux 文件目录管理常用命令
  • 如何减少极狐GitLab 容器镜像库存储?
  • 基于卷积神经网络和Pyqt5的猫狗识别小程序
  • Femap许可使用数据分析
  • NestJS 框架深度解析
  • 《让歌声跨越山海:Flutter借助Agora SDK实现高质量连麦合唱》
  • 力扣题解:21.合并两个有序链表(C语言)
  • 对遗传算法思想的理解与实例详解
  • Redis 主从复制集群搭建教程
  • 基于vue框架的电子商城m8qu8(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。
  • 构筑芯片行业的“安全硅甲”
  • SSL证书格式详解:PEM、CER、DER、JKS、PKCS12等
  • k8s之探针
  • 数据结构【二叉搜索树(BST)】
  • opencv中的图像特征提取
  • 解构C++高级命名空间:构建空间作用域·控制兼容
  • 【MySQL】第二弹——MySQL表的增删改查(CRUD)