【java学习—十五】线程的通信(6)

news2024/11/28 0:33:52

文章目录

  • 1. 线程通信
    • 1.1. wait() 方法:
    • 1.2. notify()/notifyAll() 方法


1. 线程通信

wait()notify()notifyAll()

    ①wait():令当前线程挂起并放弃 CPU 、同步资源,使别的线程可访问并修改共享资源,而当前线程排队等候再次对资源的访问
    ②notify():唤醒正在排队等待同步资源的线程中优先级最高者结束等待
    ③notifyAll():唤醒正在排队等待资源的所有线程结束等待 .

    注意:Java.lang.Object 提供的这三个方法只有在 synchronized 方法synchronized 代码块中才能使用,否则会报 java.lang.IllegalMonitorStateException 异常(这三种方法只能在有同步锁的方法或者代码块中)

1.1. wait() 方法:

在当前线程中调用方法: 对象名.wait()

    功能:使当前线程进入等待(某对象)状态 ,直到另一线程对该对象发出 notify ( 或 notifyAll) 为止。

    调用方法的必要条件:当前线程必须具有对该对象的监控权(加锁)

    调用此方法后,当前线程将释放对象监控权 ,然后进入等待
    在当前线程被 notify 后,要重新获得监控权,然后从断点处继续代码的执行。

1.2. notify()/notifyAll() 方法

在当前线程中调用方法: 对象名.notify()

    功能:唤醒等待该对象监控权的一个线程。

    调用方法的必要条件:当前线程必须具有对该对象的监控权(加锁)


举例:

package day15;

public class Test2 {
	public static void main(String[] args) {
		
		//定义账户对象
		Account a = new Account();
		
		//多线程对象
		User u_weixin = new User(a, 2000);
		User u_zhifubao = new User(a, 2000);
		
		Thread weixin = new Thread(u_weixin, "微信");
		Thread zhifubao = new Thread(u_zhifubao, "支付宝");
		
		weixin.start();
		zhifubao.start();
	}
}

class Account{
	public static int money = 3000;//全局变量,所有操作共享这个变量
	
	/**
	 * synchronized修饰代码块,想要根据不同的对象有不同的锁
	 * synchronized(a)这个小括号中传入不同的对象就是不同的锁
	 * @param m
	 */
	public void drawing5(int m, Account a) {
		
		synchronized(a) {//表示通过方法的参数传递进来的对象的代码块被加了synchronized同步锁
			//不同的对象就有不同的同步锁
			String name = Thread.currentThread().getName();
			
			//如果是微信操作,先不执行,等待支付宝操作,支付宝操作完,微信再继续操作
			if(name.equals("微信")) {
				try {
					a.wait();//当前的线程进入等待的阻塞状态
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
			}
			
			if(money < m) {
				System.out.println(name + "操作,账户金额不足:" + money);
			}else {
				System.out.println(name + "操作,账户原有金额:" + money);
				System.out.println(name + "操作,取款金额:" + m);
				
				money = money - m;
				
				System.out.println(name + "操作,取款后的余额:" + money);
			}
			
			if(name.equals("支付宝")) {
				try {
					a.notify();//唤醒当前优先级最高的线程,进入就绪状态
					//a.notifyAll();//唤醒当前所有的线程,进入就绪状态(效果和notifyAll()一样)
				} catch (Exception e) {
					e.printStackTrace();
				}
				
			}
		}
	}
	
	
	
}

class User implements Runnable{
	
	Account account;
	int money;
	
	public User(Account account, int money) {
		this.account = account;
		this.money = money;
	}
	
	@Override
	public void run() {
		
		account.drawing5(money, account);		
	}
}

运行结果:(先执行支付宝的线程,再执行微信的线程)

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Vue3 生命周期

如下是Vue3的生命周期函数图&#xff1a; 一、Vue2生命周期和Vue3声明周期的区别 1. Vue2 中&#xff0c;只要创建Vue实例对象而不需要挂载就可以实现beforeCreate 和 created 生命周期函数。 Vue3中必须要将Vue实例对象挂载完成&#xff0c;所有的准备工作做完&#xff0c;…

视频号视频怎么保存?教你三种方法

现在随着视频号的兴起&#xff0c;很多用户都喜欢在视频号上分享自己的生活、工作和兴趣爱好。但是很多人都遇到了一个问题&#xff0c;就是视频号上看到了喜欢的视频&#xff0c;想要保存下来&#xff0c;却不知道怎么做。今天我们就来教大家三种方法&#xff0c;让你轻松保存…

Servlet---从创建项目到部署项目的整个流程

文章目录 创建项目引入Servlet依赖创建目录结构编写代码打包程序部署程序验证程序 创建项目 引入Servlet依赖 为什么需要引入依赖资源呢&#xff1f; Servlet不是标准库自带的&#xff0c;需要从外部引入进来才能使用。如何引入&#xff1f; 利用maven&#xff0c;maven的一个…

SystemVerilog学习 (9)——随机化

目录 一、概述 二、随机化 2.1、如何简单地产生一个随机数 2.1.1 利用系统函数产生随机数 2.1.2 urandom() 2.2、什么需要随机化 2.3、随机约束 2.3.1 rand 和 randc 2.3.2 随机约束的使用 2.3.3 约束块 三、总结 一、概述 随着设计变得越来越大,要产生一个完整的激…

【技巧】Windows 11 如何安装日文语言包和日文系统

Windows 11 如何安装日文语言包和日文系统 安装日语语言第一步&#xff1a;打开系统设置第二步&#xff1a;选择【时间和语言】选项第三步&#xff1a;点击【添加语言】按钮第四步&#xff1a;输入语言&#xff0c;并选择第五步&#xff1a;安装输入法/语言包第六步&#xff1a…

2022年12月 Python(六级)真题解析#中国电子学会#全国青少年软件编程等级考试

Python等级考试&#xff08;1~6级&#xff09;全部真题・点这里 一、单选题&#xff08;共25题&#xff0c;每题2分&#xff0c;共50分&#xff09; 第1题 数据文件“abc.txt”中包含若干个英文单词&#xff0c;如图所示&#xff1a; 读取文件“abc.txt”中数据的Python程序段…

springboot326校园体育场馆(设施)使用管理网站

交流学习&#xff1a; 更多项目&#xff1a; 全网最全的Java成品项目列表 https://docs.qq.com/doc/DUXdsVlhIdVlsemdX 演示 项目功能演示&#xff1a; ————————————————

Milvus Standalone安装

使用Docker Compose安装 Milvus standalone&#xff08;即单机版&#xff09;&#xff0c;进行一个快速milvus的体验。 前提条件&#xff1a; 1.系统可以使用centos 2.系统已经安装docker和docker-compose 3.milvus版本这里选择2.3.1 由于milvus依赖etcd和minio&#xff0c…

11.16堆的一些性质与操作

1016 7&#xff0c;5&#xff0c;4&#xff0c;3&#xff0c;2&#xff0c;6&#xff0c;1 7&#xff0c;4&#xff0c;6&#xff0c;1&#xff0c;3&#xff0c;2&#xff0c;5 没有度为1的结点说明为满树 A.哈夫曼树一定没有度为1的结点。最大堆可能有度为1的结点 D.哈夫曼…

【图像分类】【深度学习】【Pytorch版本】ResNet模型算法详解

【图像分类】【深度学习】【Pytorch版本】 ResNet模型算法详解 文章目录 【图像分类】【深度学习】【Pytorch版本】 ResNet模型算法详解前言ResNet讲解Deep residual learning framework(深度残差学习框架)ResNet残差结构ResNet模型结构 ResNet Pytorch代码完整代码总结 前言 …

【OpenCV实现图像:OpenCV进行OCR字符分割】

文章目录 概要基本概念读入图像图像二值化小结 概要 在处理OCR&#xff08;Optical Character Recognition&#xff0c;光学字符识别&#xff09;时&#xff0c;利用传统的图像处理方法进行字符切分仍然是一种有效的途径。即便当前计算机视觉领域主导的是卷积神经网络&#xf…

AI中文版怎么用,版本分享,GPT官网入口

网页版上线啦&#xff0c;在线助力大学生、上班族的高效生活&#xff01; GPT4.0是OpenAI最新推出的聊天模型&#xff0c;它的语言理解和生成能力比以前的版本更强大。对于忙碌的上班族来说&#xff0c;GPT4.0能帮助你高效处理工作中的大部分写作任务&#xff0c;比如撰写报告…

TS7031: Binding element ‘role‘ implicitly has an ‘any‘ type.

文章 前言错误场景问题分析解决方案后言 前言 ✨✨ 他们是天生勇敢的开发者&#xff0c;我们创造bug&#xff0c;传播bug&#xff0c;毫不留情地消灭bug&#xff0c;在这个过程中我们创造了很多bug以供娱乐。 前端bug这里是博主总结的一些前端的bug以及解决方案&#xff0c;感兴…

【C++】类和对象(5)--拷贝构造函数

目录 一 概念 二 拷贝构造函数特性 1. 重载形式 2. 参数原则 3 默认拷贝函数 三 拷贝构造函数的实现 一 概念 在创建对象时&#xff0c;可否创建一个与已存在对象一某一样的新对象呢&#xff1f; class Date { public:Date(int year 1900, int month 1, int day 1)/…

nestJs 高阶用法

真正的服务器需要做全局的数据核查、敏感操作落库和数据转化。 拥有这些能力才能让后台能力更加丰富&#xff0c;本篇将主要使用 NestJs 的高级能力&#xff0c;来实现这些功能。 使用 guards 和 decorators 实现数据校验核查通过 interceptors 和 decorators 实现敏感操作录…

Linux三剑客:grep的基本使用

目录 grep介绍 什么是grep和egrep 使用grep 命令格式 命令功能 命令参数 grep配合正则表达式使用 认识正则 基本正则表达式 匹配字符 配置次数 位置锚定&#xff1a;定位出现的位置 分组和后向引用 作为学习一名计算机专业的学生&#xff0c;我想Linux应该需要了解…

详细自动化测试介绍

&#x1f4e2;专注于分享软件测试干货内容&#xff0c;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; 如有错误敬请指正&#xff01;&#x1f4e2;交流讨论&#xff1a;欢迎加入我们一起学习&#xff01;&#x1f4e2;资源分享&#xff1a;耗时200小时精选的「软件测试」资…

【10套模拟】【5】

关键字&#xff1a; 数据的最小单位、归并排序&#xff08;两两归并&#xff09;、单链表顺序存取、邻接表表头顶点顺序存储随机访问、三角矩阵元素个数、堆的性质、冒泡排序、二叉树是否相同

我对需求分析的理解

一、背景 最近做了一个项目&#xff0c;也算是踩坑过程&#xff0c;产品上线了&#xff0c;用户不怎么买单&#xff0c;使用者聊聊无几&#xff0c;前期一直不清楚为什么会这样&#xff0c;诚然新系统的开发设计上采用了更新的技术&#xff0c;设计上采用了更好的理念&#xf…

知识梳理到了领域榜一,意外,开心。

我的护城河 就是掌握的不断更新的技术。 一直被认可的能力。 完美的项目交付。 写的文章得到了读者们的认可。 希望我做的努力被更多的人看到。 分享的代码片可以解决他人的问题。 很惊喜&#xff0c;今早我的文章被数据结构和算法领域内容榜排到了第一名。 被认可的感觉很棒。…