目录

一、主线程与子线程基础通信

1.1 主线程向子线程传递数据

二、子线程向主线程返回数据

2.1 通过共享变量方式

2.2 同步块中使用wait/notify机制

2.3 Lock和Condition实现线程通信机制


一、主线程与子线程基础通信

1.1 主线程向子线程传递数据

  • 通过构造函数传递参数:主线程通过UserThread的构造函数将数据a传递给子线程

package com.demo6;public class Test {public static void main(String[] args) {System.out.println(Thread.currentThread().getName()+",主线程");int  a  = 10;UserThread  u  = new UserThread(a);u.start();}
}
package com.demo6;public class UserThread  extends Thread{int  a  ;public UserThread(int a){this.a  = a;}public void  run(){System.out.println(Thread.currentThread().getName()+",执行run方法"+",a的值为:"+a);}}
  • 输出结果:主线程创建子线程后,子线程输出接收到的参数值

二、子线程向主线程返回数据

2.1 通过共享变量方式

  • sleep等待:主线程通过sleep等待子线程完成计算

  • 共享变量:子线程将计算结果存储在成员变量中,主线程通过getter方法获取

  • 缺点:sleep时间难以精确控制,可能等待过长或过短

package com.demo7;public class Test {public static void main(String[] args) {UserThread ut  =new UserThread();ut.start();try {Thread.sleep(5*1000);} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}System.out.println("主线程通过getter方法获取的值为: "+ut.getSum());}}
package com.demo7;public class UserThread   extends Thread{private int sum = 0;public void  run(){for(int i=0;i<=100;i++){this.sum +=i;}}public int  getSum(){return this.sum;}}

运行结果:

2.2 同步块中使用wait/notify机制

  • 同步协作:主线程和子线程使用同一个对象锁进行同步

  • wait/notify机制:主线程等待,子线程完成后通知主线程

(1)当主线程持有的是当前线程类对象的锁,如果是当前线程类对象的自己this和父类(Object/Thread.class/接口父类.class),都可以通知解锁。 都可以显示的或隐式的写notify。

package com.demo13;public class Test {public static void main(String[] args) {UserThread u = new UserThread();u.start();//线程通信的必须的条件是:同一个对象//如果持有的是当前线程类对象的锁,如果是当前线程类对象的自己this和父类,都可以通知解锁//都可以显示的或隐式的写notifysynchronized (u) {try {//主线程持有u对象的锁,被阻塞u.wait();} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}System.out.println("主线程获取的值为:"+u.getSum());}}}
package com.demo13;public class UserThread   extends Thread  implements IUser{private int  sum = 0;Object  obj  = new Object();public void run(){//		synchronized (this) {
//			for(int i=0;i<=100; i++)
//			{
//				sum+=i;
//			}
//		this.notify();
//		}//		synchronized (Thread.class) {
//			for(int i=0;i<=100; i++)
//			{
//				sum+=i;
//			}
//		}//		synchronized (obj) {
//			for(int i=0;i<=100; i++)
//			{
//				sum+=i;
//			}
//		}synchronized (IUser.class) {for(int i=0;i<=100; i++){sum+=i;}}}public  int getSum(){return this.sum;}}
package com.demo13;public interface IUser {}

运行结果:

(2)当主线程持有的是非线程类对象的锁,子线程持有的也只能是非线程类对象的锁。这是只能显示的写notify。

package com.demo13;public class Test {public static void main(String[] args) {User  u1  =  new User();UserThread   u = new UserThread(u1);u.start();synchronized (u1) {try {//主线程持有u1对象的锁,内阻塞u1.wait();} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}System.out.println("主线程获取的值为:"+u.getSum());}}}
package com.demo13;public class UserThread   extends Thread  implements IUser{private int  sum = 0;User  u1;public UserThread(User u1) {this.u1 = u1;}public void run(){synchronized (u1) {for(int i=0;i<=100; i++){sum+=i;}//显示解锁u1.notify();}}public  int getSum(){return this.sum;}}
package com.demo13;public class User {}

运行结果:

如果子线程又new了User类对象u1,此时主线程和子线程的u1不是同一个对象,会发生死锁:

2.3 Lock和Condition实现线程通信机制

        这是一种基于明锁(Lock)和条件变量(Condition)的线程通信机制,属于JUC包中的高级同步机制。

     工作流程:

  1. 创建锁和条件:主线程创建ReentrantLock和Condition对象

  2. 传递资源:将锁和条件传递给子线程

  3. 主线程等待:主线程获取锁后调用cond.await()进入等待状态

  4. 子线程执行:子线程获取锁,执行计算任务

  5. 发送信号:子线程完成任务后调用cond.signal()唤醒主线程

  6. 结果获取:主线程被唤醒后获取并输出计算结果

package com.demo31;import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;public class Test {public static void main(String[] args) {Lock  lock  = new ReentrantLock();// 通过锁创建条件变量Condition cond  =lock.newCondition();UserThread  u1  =  new UserThread(lock,cond);u1.start();lock.lock();try {// 主线程等待条件信号cond.await();// 收到信号后输出计算结果System.out.println(u1.getSum());} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}// 手动释放锁lock.unlock();}}
package com.demo31;import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;public class UserThread extends Thread {private Lock lock;private int sum;private Condition cond;public UserThread(Lock lock,Condition cond) {this.lock = lock;this.cond  =cond;}public void run() {lock.lock();for (int i = 0; i <= 100; i++) {try {Thread.sleep(200);} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}this.sum += i;}// 发送条件信号,唤醒等待的线程this.cond.signal();// 释放锁this.lock.unlock();}public  int getSum(){return  this.sum;}}

运行结果:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/news/921070.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/921070.shtml
英文地址,请注明出处:http://en.pswp.cn/news/921070.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

硬盘 (FOREIGN) Slot:Unconfigured Bad

IBM 服务器硬盘故障&#xff0c;在webbios里看到有显示&#xff08;Foreign&#xff09;Slot:xxxx, Unconfigured Bad的硬盘&#xff0c;选中该硬盘进入属性页面在属性列表中找到“Media Error”和“Pred Fail Count”两项&#xff08;如果找不到请点击【Next】翻页&#xff09…

Vite 环境变量与全局变量详解

目录 一、什么是环境变量&#xff1f; 二、Vite 的环境变量机制 1. .env 文件 2. 定义环境变量 3. 使用环境变量 4. 内置环境变量 三、Vite 中的全局变量 1. 使用 define 配置 2. 使用 TypeScript 声明 四、环境变量 vs 全局变量 五、常见问题与坑点 1. 为什么必须…

华为S5720交换机配置教程:开启Web管理功能

华为S5720交换机Web登录配置指南 华为S5720系列交换机支持通过Web界面进行管理&#xff0c;这是一种图形化的操作方式&#xff0c;比命令行更直观易用。以下是配置S5720交换机开启Web登录的详细步骤。 一、准备工作 连接设备&#xff1a;使用Console线连接交换机的Console…

插入排序及希尔排序

插入排序是一种十分简单有效的排序算法&#xff0c;其基本思想就是将每一个待排序的数据按照关键字大小插入前边已经排好序的子序列之中。 文章目录最基本的插入排序折半插入排序希尔排序 最基本的插入排序 插入排序的基本思想如图可以看出&#xff0c;不断选中数组中的元素&am…

码农必备!本地调试神器act,GitHub Actions最佳拍档

引言 在现代软件开发实践中&#xff0c;持续集成和持续部署(CI/CD)已成为不可或缺的环节。GitHub Actions 作为 GitHub 官方提供的 CI/CD 解决方案&#xff0c;凭借其与代码仓库的深度集成和丰富的生态系统&#xff0c;获得了广大开发者的青睐。然而&#xff0c;每次修改 CI/C…

大模型本地部署与API服务教程

大模型本地部署与API服务教程 目标&#xff1a;在Ubuntu服务器部署本地大模型&#xff0c;并提供API服务&#xff0c;支持局域网下的Windows客户端调用。 支持两种部署方式&#xff1a;① 自建FastAPI服务&#xff08;高定制&#xff09; ② 使用Ollama&#xff08;极简快速&am…

亚马逊美加站点物流新规解读:库存处理逻辑重构与卖家应对策略

2025年9月&#xff0c;亚马逊美国与加拿大站点即将实施物流计划强制调整&#xff0c;批量清货与捐赠计划的规则迭代&#xff0c;标志着平台对库存生命周期管理的重视程度提升&#xff0c;此次新规以“可持续发展”为核心导向&#xff0c;通过强制与默认参与的双重机制&#xff…

SpringBoot Web 入门指南:从零搭建第一个SpringBoot程序

SpringBoot Web 入门指南&#xff1a;从零搭建第一个SpringBoot程序SpringBoot Web 入门指南&#xff1a;从零搭建第一个SpringBoot程序一、Web开发基础&#xff1a;静态/动态资源与B/S、C/S架构解析​资源类型系统架构二、Spring 与 Spring Boot 核心介绍1. Spring 框架2. Spr…

从图灵完备性到现实差距:为什么你的设备和你本人都潜力无限,却表现各异?

理论上的无限潜力&#xff0c;为何被困在现实的牢笼中&#xff1f;一、引言&#xff1a;一个反直觉的概念 在计算机科学中&#xff0c;图灵完备性&#xff08;Turing Completeness&#xff09; 是衡量一个系统计算能力的黄金标准。它得名于计算机科学之父艾伦图灵&#xff08;A…

Android系统打通HAL层到应用层 --- Framework框架搭建

本文是接续上文&#xff0c;针对于HAL层的接口封装Framework层的接口 HAL层框架搭建&#xff1a;https://blog.csdn.net/m0_50408097/article/details/151148637?spm1001.2014.3001.5502 在 Android 系统架构中&#xff0c;Framework 层&#xff08;框架层&#xff09; 位于 H…

LwIP入门实战 — 2 LwIP概述

目录 2.1 LwIP简介 2.2 LwIP文件架构分析 2.2.1 LwIP软件架构 2.2.2 主要模块划分 2.3 IPC通讯机制 2.4 LwIP的3种编程接口 2.4.1 RAW/Callback API 2.4.2 Netconn API 2.1 LwIP简介 LWIP&#xff08;Light Weight Internet Protocol&#xff0c;轻型网络协议栈&#…

微信小程序-day3

页面导航跳转声明式导航注意&#xff1a;url开头要有/1. 导航到 tabBar 页面2. 导航到非 tabBar 页面3. 后退导航编程式导航跳转传参参数可以在onLoad里用option获取下拉刷新事件可在onPullDownRefresh中定义下拉事件对应操作在其中加入这个函数wx.stopPullDownRefresh()&#…

关于ES中文分词器analysis-ik快速安装

ES中文分词器插件 安装快速安装手动安装 应用ik_max_word 与 ik_smart 的区别验证是否生效 官方地址&#xff1a;https://github.com/infinilabs/analysis-ik 安装 快速安装 插件安装&#xff08;将链接最后的版本号换成当前ES版本号&#xff09;&#xff1a; bin/elastics…

STM32G4 电流环闭环

目录一、STM32G4 电流环闭环1 电流环闭环PID控制2 电流环闭环建模附学习参考网址欢迎大家有问题评论交流 (* ^ ω ^)一、STM32G4 电流环闭环 1 电流环闭环 电流环框图 PID控制 时域和拉普拉斯域的传递函数 PID&#xff1a; P比例部分&#xff0c;I积分部分&#xff0c;D微分…

利用 Java 爬虫获取淘宝商品详情 API 接口

本文将详细介绍如何使用 Java 编写爬虫程序&#xff0c;通过淘宝开放平台的高级版 API 接口获取商品的详细信息。一、淘宝商品详情 API 接口概述淘宝开放平台提供了多个 API 接口用于获取商品的详细信息&#xff0c;其中 taobao.item.get 和 taobao.item.get_pro 是常用的接口。…

idea上传本地项目代码到Gitee仓库教程

前言&#xff1a;本地一个项目代码上传到Gitee仓库1.登录Gitee官网新建仓库&#xff08;命名跟项目同名&#xff09;2.idea添加Gitee插件&#xff08;需要Restart&#xff09;3.idea配置已安装git的路径4.idea添加Gitee账户5.给项目创建Git本地仓库Git仓库创建成功&#xff0c;…

往届生还有机会进入计算机这个行业吗?还能找见好工作吗

前言 最近有很多的往届生来咨询我&#xff0c;问我还能找见工作吗&#xff0c;还能进入这一行吗&#xff08;大多数都是一些24届&#xff0c;考研失败的同学&#xff09; 针对目前这种情况&#xff0c;还能不能进&#xff0c;只能说很难&#xff0c;非常难。 在这里&#xff0c…

Python爬虫实战:研究 Lines, bars and markers 模块,构建电商平台数据采集和分析系统

1. 引言 1.1 研究背景 随着互联网技术的飞速发展,网络上积累了海量的数据资源,这些数据蕴含着丰富的信息和价值。如何高效地获取、处理和分析这些数据,成为信息时代面临的重要课题。Python 作为一种功能强大的编程语言,凭借其丰富的库支持和简洁的语法,在网络数据爬取和…

大文件稳定上传:Spring Boot + MinIO 断点续传实践

文章目录一、引言&#xff1a;问题背景二、技术选型与项目架构三、核心设计与实现1. 初始化上传 (/init)2. 上传分块 (/chunk)3. 完成上传与合并 (/complete)4. 查询上传进度 (/progress)四、断点续传工作流程五、方案优势总结六、拓展优化七、方案优势对比一、引言&#xff1a…

表达式语言EL

表达式语言EL 1.EL表达式的作用 可以说&#xff0c;EL&#xff08;Expression Language&#xff09;表达式语言&#xff0c;就是用来替代<% %>的&#xff0c;EL比<%%>更简洁&#xff0c;更方便。 2.与请求参数有关的内置对象 1.使用表达式&#xff1a;<%request…