java进阶—线程间通信(通俗易懂等待唤醒机制)

news/2025/1/1 9:41:24/

今天我们来看一看,线程之间的通信,也就是我们所说的等待唤醒机制

先来看三个关键方法:

wait();

当线程执行这个方法,它就会进入阻塞状态,并且释放同步监视器

notify();

英文翻译 唤醒,就是说会唤醒wait的线程,注意一点,是唤醒别人,不是唤醒自己,A进入wait 状态 ,需要 B 执行notify 方法去唤醒A,很好理解,你睡着了,不能自己叫醒自己,得闹钟或者别人叫醒你,自然醒那是 sleep()、

如果有多个线程进入阻塞状态,就会唤醒优先级较高的线程

notifyAll();

加了个all,唤醒全部,所有被阻塞的线程全部唤醒

这边举一个通俗的例子:不知道大家小时候有没有玩过 类似 ”全国人民大解放“ 的游戏 ,一个小朋友抓,其他跑,快要被抓住,喊出什么话(这边具体是什么忘了),就不能动了(这边类似你进入wait),得等到别人来拍你,(一般都是会先拍比较厉害的那一个)你才能动 (这边类似notify,别人来唤醒你) ,当仅剩下一个小伙伴在活动,就可以喊出 “全国人民大解放” ,所有人都可以活动(这就类似 notifyAll)

到这,应该对于等待唤醒机制比较了解了

直接上代码,通过代码我们来看看是怎么一回事

比如:

模拟两个线程进行交替打印1-10

首先我们来看看线程没有进行通信,两个线程进行资源抢占的情况:


public class Demo  implements Runnable{int  num = 1;@Overridepublic void run() {while (true) {synchronized (this) {if (num<=10) {System.out.println(Thread.currentThread().getName()+":"+num);num++;} else {break;}}}}public static void main(String[] args) {Demo demo =new Demo();Thread thread1 =new Thread(demo,"线程1");Thread thread2 =new Thread(demo,"线程2");thread1.start();thread2.start();}
}

在这里插入图片描述
可以看到所有资源都被线程1抢占,不符合我们的需求

接下来看看两个线程间进行通信后的结果


public class Demo  implements Runnable{int  num = 1;@Overridepublic void run() {while (true) {synchronized (this) {notify();if (num<=10) {System.out.println(Thread.currentThread().getName()+":"+num);num++;try {//使线程进入阻塞wait();} catch (InterruptedException e) {e.printStackTrace();}} else {break;}}}}public static void main(String[] args) {Demo demo =new Demo();Thread thread1 =new Thread(demo,"线程1");Thread thread2 =new Thread(demo,"线程2");thread1.start();thread2.start();}
}

在这里插入图片描述
在这里插入图片描述
线程间通信就引出了一个生产者,消费者的问题

就比如去饭店吃饭,得有饭才能去吃

生产者:Productor


public class Productor  implements Runnable{List<String> list  = new ArrayList<>();public Productor(List<String> list) {this.list = list;}@Overridepublic void run() {int num = 0;while (true) {synchronized (list) {if (list.size() == 0) {num++;//没有饭生产list.add("第" + num + "份米饭");try {Thread.sleep(3000);} catch (InterruptedException e) {e.printStackTrace();}System.out.println(Thread.currentThread().getName() + "生产了" + list.get(0));list.notify();} else {// 有饭等待消费者消费try {list.wait();} catch (InterruptedException e) {e.printStackTrace();}}}}}
}

消费者:


public class Consumer  implements Runnable{List<String> list;public Consumer(List<String> list) {this.list = list;}@Overridepublic void run() {while (true) {synchronized (list) {if (list.size() > 0) {//有饭消费,并通知生产者try {Thread.sleep(3000);} catch (InterruptedException e) {e.printStackTrace();}System.out.println(Thread.currentThread().getName() + "消费了" + list.get(0));list.remove(0);list.notify();} else {//无饭等待try {list.wait();} catch (InterruptedException e) {e.printStackTrace();}}}}}
}

进行创建线程

 public static void main(String[] args) {List<String> list = new ArrayList<>();Productor productor =new Productor(list);Consumer consumer =new Consumer(list);new Thread(productor,"小红").start();new Thread(consumer,"小明").start();}

输出结果:

在这里插入图片描述
以上就是等待唤醒机制的全部内容了

在这里插入图片描述
java进阶—多线程

java 进阶—线程的常用方法

java进阶—线程安全问题

Java 进阶—死锁造成原因及其解决


http://www.ppmy.cn/news/314687.html

相关文章

MySQL数据库,从入门到精通:第三篇——MySQL 数据库规范和基础查询语句

MySQL数据库&#xff0c;从入门到精通&#xff1a;第三篇——MySQL 数据库规范和基础查询语句 1. SQL概述1.1 SQL背景知识1.2 SQL语言排行榜1.3 SQL 分类 2. SQL语言的规则与规范2.2 SQL大小写规范 &#xff08;建议遵守&#xff09;2.3 注 释2.4 命名规则&#xff08;暂时了解…

vue3中的event bus

vue3中的event bus 前言vue2中的event busevent bus在vue3中的体现创建一个vue3的event bus封装的event bus最优使用场景 前言 event Bus在vue3中事实上已经被删除了&#xff0c;因为官方说它可能会导致一些潜在的问题。如&#xff0c;在大型项目中使用 Event Bus 可能会变得难…

iOS8高清壁纸 - 专为iOS8量身定做,每日更新

特色功能介绍&#xff1a; 1、海量的高清精美壁纸 2、每日更新&#xff0c;让您紧跟潮流壁纸的步伐 3、提供多达21个类别以供筛选 4、专为iOS8系统iPhone量身定做&#xff0c;壁纸保存后无需修改&#xff0c;可直接选作壁纸

绝对精美的ios壁纸【收藏】

图片发自简书App 图片发自简书App 图片发自简书App 图片发自简书App 图片发自简书App 图片发自简书App 图片发自简书App 图片发自简书App 图片发自简书App 图片发自简书App 图片发自简书App 图片发自简书App 图片发自简书App 图片发自简书App 图片发自简书App 图片发自简书App …

闲置APP小程序开发 你不喜欢的可能正是别人需要的

生活中我们常常会产生各种闲置物品&#xff0c;尤其是对于有宝宝的家庭来说&#xff0c;孩子小的时候可能会添置各种玩具、婴儿车或者是别的用品&#xff0c;随着孩子渐渐长大&#xff0c;这些东西都用不上了&#xff0c;但是扔了又觉得很可惜&#xff0c;留着又占地方&#xf…

保障公司数据安全,全靠电脑监控系统!

在这信息化时代&#xff0c;因商业竞争的关系&#xff0c;企业数据和信息安全越来越受到重视。竞争对手随时可能通过网络&#xff0c;或是派遣人员来盗取机密信息。为保护企业的核心信息&#xff0c;电脑监控成为了一种必要的手段。 电脑监控系统有什么优势吗&#xff1f; 1.…

html 拦截境外ip,网站怎样屏蔽所有国外IP访问? 一个小技巧可以搞定!

最近很多人的网站被攻击&#xff0c;肯定会有很多的国外ip&#xff0c;如果你的网站不是做外贸的&#xff0c;那么我建议你屏蔽所有的国外ip吧&#xff0c;至少我就屏蔽了所有的国外用户。 我猜想外国人也有搞网赚的&#xff0c;但是估计不会搞中国的网赚吧&#xff0c;毕竟汉语…

国外域名能注册吗?

国外域名能注册吗?选择国外域名注册商还是国内的好?申请网站域名随着科技的不断发展进入了人们的视野&#xff0c;域名作为一个网站的标识&#xff0c;对网站形象有着极大的影响力&#xff0c;随着域名投资市场的风起云涌&#xff0c;注册域名的不仅仅是企业和站长&#xff0…