线程间通信

1976国际标准大气_Matlab 输入高度,计算空气密度、气压、温度、声速 function [airDens,airPress,temp,soundSpeed]=Atmos(geomAlt) %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % 1976 U.S Standard Atmosphere Interpolation % % Note: Function does not extr. 阅读详情

之前的售票程序或者银行取钱例子中,所有线程执行的代码都是一样的。
线程间通信:A线程往里存,B线程往外取。
AB线程的动作不一致,也就需要有两个run方法。两个run方法就要存在两个线程当中。什么时候可以取,什么时候可以存,这就需要线程之间的通信。

例子:一个写入线程负责写,读取线程负责读,两者操作的是同一个资源,但是操作的动作是不同的。这时就要进行线程间通信。

package fighting;

public class ThreadCommunication {

	/**
	 * 线程间通讯:解决安全问题(要用同一个锁)
	 * 其实就是多个线程在操作同一个资源,但是操作的动作不同。这样就需要通讯。
	 * 
	 * 同步以后也会发生一种情况:
	 * 就是输入线程往里存了一个,输出线程可能会执行了多次,取了多次,
	 * 这样输出线程就会取到多次相同的值。这需要等待唤醒机制来解决。
	 * 等待唤醒机制:就是需要一个资源的flag。
	 * 
	 * wait()和notify(),notifyAll()
	 * 这几个方法都是用在同步中,要对持有监视器(也就是锁)的线程操作。
	 * 
	 * 为什么线程用到的方法wait()和notify(),notifyAll()会定义在Oject类中,而不是定义在Thread类中?
	 * 因为这些方法在操作同步的线程时,都必须要标识它们所操作线程持有的锁。
	 * 只有同一个锁上的被等待线程,可以被同一个锁上nofify唤醒。
	 * 不可以对不同锁中的线程唤醒。
	 * 也就是说,等待和唤醒必须是同一个锁。
	 * 而锁可以使任意对象,所以可以被任意对象调用的方法要定义在Oject类中。
	 *
	 */
	public static void main(String[] args) {
		Resource r = new Resource();
		
		InputThread in = new InputThread(r);
		OutputThread out  = new OutputThread(r);
		
		new Thread(in).start();
		new Thread(out).start();

	}

}
//线程要操作的资源
class Resource{
	String name;
	String sex;
	boolean flag = false;//等待唤醒机制的标志位
}
//输入的线程
class InputThread implements Runnable{

	private Resource r;
	InputThread(Resource r){
		this.r=r;
	}
	public void run() {//同步synchronize写在run方法,就变成了单线程了,一个线程进来,其他线程就进不来了
		boolean b=true;
		int i=0;
		while(true){
			/**
			 * 这里同步锁用了r,是因为InputThread和OutputThread两个线程操作的都是一个r。
			 * 这里也可以用InputThread.class或OutputThread.class或Resource.class,
			 * 只要在内不能中是唯一的就可以,但是这样显得牵强。
			 */
			synchronized (r) {
				if(r.flag){//flag为True,说明已经有资源,不用再存,线程等待
					try {
						r.wait();//知识点:等待的线程存在内存线程池中,notify唤醒的都是线程池中的线程。
						         //注意:wait和notify方法必须标明是哪个锁,而且这个锁要和同步的锁是一个才可以。
					} catch (InterruptedException e) {
						e.printStackTrace();
					}
				}
				if(b){
					r.name="张三"+(i++);
					r.sex="男";
					b=false;
				}else{
					r.name="李四"+(i++);
					r.sex="女";
					b=true;
				}
				r.flag=true;
				r.notify();//唤醒等待的一个线程。还有一个方法notifyAll,唤醒所有等待的线程
			}
		}
	}
	
}
//取走的线程
class OutputThread implements Runnable{
	private Resource r;
	OutputThread(Resource r){
		this.r=r;
	}
	public void run() {
		while(true){
			synchronized (r) {
				if(!r.flag){//flag为false,说明没有资源,不能取,线程等待
					try {
						r.wait();
					} catch (InterruptedException e) {
						e.printStackTrace();
					}
				}
				System.out.println(r.name+"..."+r.sex);
				r.flag=false;
				r.notify();
			}
		}
		
	}
	
}

代码优化:把资源类Resource的成员私有化。

package fighting;

public class ThreadCommunication {

	/**
     * 代码优化:把资源私有化
	 */
	public static void main(String[] args) {
		Resource r = new Resource();
		
		InputThread in = new InputThread(r);
		OutputThread out  = new OutputThread(r);
		
		new Thread(in).start();
		new Thread(out).start();

	}

}
//线程要操作的资源
class Resource{
	private String name;
	private String sex;
	private boolean flag = false;//等待唤醒机制的标志位
	public synchronized void set(String name,String sex){
		if(flag){
			try {
				this.wait();
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
		this.name=name;
		//--->如果线程在执行完上一句,在这里被其他线程抢走了执行权,则这里会出现安全问题,所以这个方法需要同步
		this.sex=sex;
		flag=true;
		this.notify();//有资源了,将其他线程唤醒,通知可以取资源了
	}
	public synchronized void out(){
		if(!flag){
			try {
				this.wait();
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
		System.out.println(name+"..."+sex);
		flag=false;
		this.notify();//这句唤醒要写在资源里面,如果线程里面,
		              //就会报错IllegalMonitorStateException(意思是当前线程不是此对象监视器的所有者)。
	}
}
//输入的线程
class InputThread implements Runnable{

	private Resource r;
	InputThread(Resource r){
		this.r=r;
	}
	public void run() {//同步synchronize写在run方法,就变成了单线程了,一个线程进来,其他线程就进不来了
		boolean b=true;
		int i=0;
		while(true){
				if(b){
					r.set("张三"+(i++), "男");
					b=false;
				}else{
					r.set("李四"+(i++), "女");
					b=true;
				}
//				r.notify();//这句唤醒如果这里,就会报错IllegalMonitorStateException(意思是当前线程不是此对象监视器的所有者),
				           //因为同步是在资源类的方法上实现的,程序执行到这的时候,已经从同步方法里出来了。
				           //当前线程是InputThread这个线程,同步锁的所有者是Resource,
		}
	}
	
}
//取走的线程
class OutputThread implements Runnable{
	private Resource r;
	OutputThread(Resource r){
		this.r=r;
	}
	public void run() {
		while(true){
				r.out();
//				r.notify();
		}
		
	}
	
}



 

微信小程序开发:实现地图导航功能 其中,id用于调用地图组件,latitude和longitude表示地图的中心点坐标,markers表示地图中的标记点,covers表示地图中的覆盖物,polyline表示地图中的折线图,show-location表示是否显示当前定位点,bindregionchange表示移动地图时触发的事件。其中,id表示标记点的唯一标识,latitude和longitude表示标记点的坐标,title表示标记点的名称,iconPath表示标记点的图标路径,width和height表示标记点的宽度和高度。 阅读详情

相关推荐

深入浅出SSD:固态存储核心技术、原理与实战(文末赠书)

作为经典畅销书的升级版,本书在第1版的基础上新增了大量新知识(如闪存、UFS、测试、文件系统等),并改写或删减了许多过时或不适用的内容,总修改量超过60%。本书由SSD技术社区SSDFans的核心团队成员联合业界、高校SSD方面的专家共同完成,相对于第1版,内容更全面、更新,也更有深度。本书从产品、技术和应用3个维度展开,全面、详细讲解了SSD的发展历史、产品形态、工作原理、整体架构,以及各个功能模块的原理和使用,从SSD的前端接口协议到FTL算法,再到后端的闪存和纠错,以及测试,本书都有涉及。

阿玥的小博客 3121

多线程之间实现通讯

熟练多线程之间通讯Wait、Notify、NotifyAll用法 需求:分别创建两个线程,名称为A和B,A线程负责写操作,也就是不停的写入名称和性别。 B线程负责读取操作, 也就是不停的读取现在写入的名称和性别, 看图演示 2.3代码实现基本实现 package ReadInput; class Res { public String userSex; publ

u014071328的专栏 4060

STM32H743IIT6+USB3300高速HID通讯实战:从CUBEMX配置到调试避坑全记录

本文详细记录了基于STM32H743IIT6微控制器与USB3300 PHY芯片实现高速USB HID通信的完整实战过程。内容涵盖从硬件选型、STM32CubeMX工程配置(重点规避引脚映射等常见陷阱)、自定义报告描述符编写,到驱动层数据收发实现与高级调试技巧的全链路解析,旨在帮助开发者快速构建稳定、高效的嵌入式高速数据通道。

vscode5coder的博客 362

线程之间的通信

参考此博客 一、为什么要线程通信? 1. 多个线程并发执行时, 在默认情况下CPU是随机切换线程的,当我们需要多个线程来共同完成一件任务,并且我们希望他们有规律的执行, 那么多线程之间需要一些协调通信,以此来帮我们达到多线程共同操作一份数据。 2.当然如果我们没有使用线程通信来使用多线程共同操作同一份数据的话,虽然可以实现,但是在很大程度会造成多线程之间对同一共享变量的争夺,那样的话势必为造成很多错误和损失! 3.所以,我们才引出了线程之间的通信,多线程之间的通信能够避免对同一共享变量的争夺。 二

qq_45644339的博客 2016

银河麒麟V10 SP3系统下如何安全安装gcc-toolset-10(附yum仓库避坑指南)

本文详细介绍了在银河麒麟V10 SP3系统中安全部署gcc-toolset-10的完整方案。核心在于通过配置默认禁用的yum仓库(如EPKL仓库)并配合--enablerepo参数进行精准安装,有效规避依赖冲突风险,实现与系统默认GCC 7.3的稳定共存。文章还提供了多版本环境切换、系统维护及故障排查的实用指南,确保操作的可控与可逆。

h0i1j2k3l的博客 587

Buck电源设计常见的一些问题(一)半桥栅极驱动芯片共性失效问题

半桥驱动芯片主要用在器件可应用于电信,数据通信,便携式存储或更低电压系统中的电源转换器,半桥、全桥、推挽、同步降压,正激变换器和同步整流器等方面。当然难免会遇到不少问题。基本上我们在产品开发的过程中都遇到过栅极驱动芯片坏掉的情况,所以找了一些资料,学习学习。也查找查找原因。

小幽余生不加糖 2369

进程间通信和线程间通信

进程间通信 转自 https://www.cnblogs.com/LUO77/p/5816326.html 线程间通信 https://www.cnblogs.com/jobs1/p/10784021.html 线程间通信 进程和线程的区别 程序只是一组指令的有序集合,它本身没有任何运行的含义,它只是一个静态的实体。而进程则不同,它是程序在某个数据集上的执行。进程是一个动态的实体,它有自己的生命周期。它因创建而产生,因调度而运行,因等待资源或事件而被处于等待状态,因完成任务而被撤消。反映...

feelinghappy的专栏 4576

麒麟V10 SP1系统下编译linuxdeployqt并打包Qt 5.15.2程序完整指南

麒麟V10 SP1系统下编译linuxdeployqt并打包Qt 5.15.2程序完整指南

ChenJin_2的博客 272

线程学习笔记

线程是程序中一个单一的顺序控制流程。进程内一个相对独立的、可调度的执行单元,是系统独立调度和分派CPU的基本单位指令运行中的程序的调度单位。在单个程序中同时运行多个线程完成不同的工作,称为多线程。 适用范围: 服务器中的文件管理或通信控制 前后台处理 异步处理   线程是进程中的实体,一个进程可以拥有多个线程,一个线程必须有一个父进程。线程不拥有系统资源,只有运行必须的一些数据结构;它

漫路求索的博客 371

Autosar MCAL-S32K324 Fls配置-基于EB

Autosar MCAL Flash配置,基于S32K324,EB软件

赞的博客 1512

.Net如何使用Web API实现数据交互?

数据模型代表了要交互的数据结构。例如,假设我们要创建一个简单的图书管理系统,我们可以定义一个Book类作为数据模型。set;set;set;

Code365 257

为什么要进行线程间通讯

因为 安卓基于四大组件开发 四大组件 默认在主线程运行 如果做耗时操作 就会导致anr 因为子线程不能做耗时操作  主线程不能更新ui 所以就引入线程间通讯 AysncTask    Handler    EventBus     Rxjava

qq_37541086的博客 736

第10集:AIOps 平台架构设计!画出面试官最想看的系统全景图

本文介绍了如何将AIOps平台的六大功能模块整合为四层架构设计,并生成专业系统全景图。文章首先指出面试中架构设计能力的重要性,强调一张清晰的架构图能直观展现全局观。随后指导读者检查项目结构,准备绘图环境。核心部分详细拆解了四层架构:数据采集层(Prometheus、ELK等)、AI分析层(巡检、告警、预测等)、决策执行层(工作流引擎、自愈Agent)和展示交互层(API、控制台)。通过Python代码自动生成模块依赖关系图,并提供了面试讲解技巧。全文旨在帮助开发者在面试中系统性地展示项目架构设计能力。

qq_2937655951的博客 92

鸿蒙中的并发线程间通信、线程间通信对象

并发线程间通信,线程间通信对象、Worker、TaskPool

2301_79624024的博客 1675

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

线程间通信的几种实现方式

线程间通信的几种实现方式 首先,要短信线程间通信的模型有两种:共享内存和消息传递,以下方式都是基本这两种模型来实现的。我们来基本一道面试常见的题目来分析: 题目:有两个线程A、B,A线程向一个集合里面依次添加元素"abc"字符串,一共添加十次,当添加到第五次的时候,希望B线程能够收到A线程的通知,然后B线程执行相关的业务操作。 方式一:使用 volatile 关键字 基于 volatile...

InterfaceJ的博客 18万+

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

线程间通信方式

<br />  线程间通信方式 收藏 <br />线程间通信可以通过下列三种方法: <br />1)使用全局变量实现线程间通信 <br />2)使用消息实现线程间通信 <br />3)使用CEvent类实现线程间通信  <br />使用全局变量实现线程间通信: <br />    定义一个全局变量,不同的线程间可以通过修改全局变量的值来进行通信。例如:定义一个控制线程的全局变量 <br />    volatile int  threadController; <br />当 threadControlle

swj2009的专栏 6655

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

iOS线程间通信

什么叫做线程间通信  在1个进程中,线程往往不是孤立存在的,多个线程之间需要经常进行通信  线程间通信的体现  1个线程传递数据给另1个线程   在1个线程中执行完特定任务后,转到另1个线程继续执行任务  线程间通信常用方法 1. NSThread :一个线程传递数据给另一个线程 - (void)performSelectorOnMainThread:(SEL)aSelector wi...

LIN1986LIN的专栏 2039

线程间通信是什么

线程间通信是什么

weixin_45428910的博客 852

java干货 线程间通信

java干货 线程间通信

qq_51305563的博客 1419

android线程间通信的几种方法_Android线程间通信机制

讲解Handler机制的博文很多,我也看了很多,但说实话,在我对Handler几乎不怎么了解的情况下,每一篇文章我都没太看懂,看完之后脑子里还是充满了疑问。究其原因,是因为几乎每一篇文章一上来就开始深入Handler源码,使得在一些宏观的问题上还是充满疑问,如果你从来没接触过Handler,对一些基础的问题还充满疑问,那深入源码去探究根源肯定会有些吃力。下面,我就从一个初学者思考的角度,来讲一讲H...

weixin_36316291的博客 2044

线程间通信的方式

一、使用volatile关键字 基于volatile关键字来实现线程间相互通信是使用共享内存的思想,就是让这个变量对所有线程都可见,一旦发生变化,都是立即可见的。 public class TestSync { // 定义一个共享变量来实现通信,它需要是volatile修饰,否则线程不能及时感知 static volatile boolean notice = false; ...

qq_41030039的博客 2696

进程间通信、线程间通信

进程间通行(Inter-Process Communication, IPC)和线程间通信(Thread Communication)的方式不完全相同,因为进程和线程的运行环境和特性不同。1、共享变量(Shard Variables)2、消息队列(Message Queue)4、信号量(Semaphore)进程间通信与线程间通信的异同。6、套接字(Socket)进程间通信(IPC)方式。5、信号(Signal)进程间通信、线程间通信。5、事件(Event)6、队列(Queue)1、管道(Pipe)

2401_86968032的博客 1054

RTT线程间的通信

接着上一章讲,这一章讲线程间的通信,常见的有邮箱、信号、消息列队

《愿你归来仍是少年》 992

python中的线程间通信

前面学习了线程的一些基本知识如与进程的区别,线程的组成,线程如何创建等,接下来继续线程的学习。

瑞瑞的博客 3975

c语言线程间传递消息,线程间通信

线程间通信前面一章讲了线程间同步,提到了信号量、互斥量、事件集等概念;本章接着上一章的内容,讲解线程间通信。在裸机编程中,经常会使用全局变量进行功能间的通信,如某些功能可能由于一些操作而改变全局变量的值,另一个功能对此全局变量进行读取,根据读取到的全局变量值执行相应的动作,达到通信协作的目的。RT-Thread 中则提供了更多的工具帮助在不同的线程中间传递信息,本章会详细介绍这些工具。学习完本章,...

weixin_34547628的博客 3758
上一篇: jdk1.5新特性
下一篇: 生产者-消费者的经典例子
wangpanbaoding
博客等级 码龄18年 42粉丝 122原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值