Object类中wait带参方法和notifyAll方法和线程间通信
notifyAll方法:

进入到Timed_Waiting(计时等待)状态有两种方式:
1.sleep(long m)方法,在毫秒值结束之后,线程睡醒,进入到Runnable或BLocked状态
2.使用wait(long m)方法,wait方法如果在毫秒结束之后,还没有被notify,就会自动醒来,进入到Runnable或BLocked状态。(区别:直接wait无参,是进入waiting无限等待状态,有参是进入Timed_Waiting限时等待状态中)
唤醒方法,也一共有两个方法:
1.notify方法唤醒在此对象监视器上等待的单个线程
2.notifyAll方法唤醒在此对象监视器上等待的所有线程
public static void main(String[] args) {
// 创建锁对象,保证唯一
Object obj = new Object();
// 创建一个顾客线程
// 使用匿名内部类,这样就不用写继承父类的子类,或实现接口的实现类
new Thread(new Runnable() {
@Override
public void run() {
// 保证等待和唤醒只能有一个在执行
// 所以需要使用同步代码块
while (true) { // 死循环
synchronized (obj) {
// 告知老板需要的包子种类和数量
System.out.println("顾客1告知老板需要的包子种类和数量");
// 调用监视器锁的wait方法,进入waiting状态
try { // 捕捉异常
// 5000毫秒之后,无notify唤醒,自动醒
obj.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
// 唤醒之后的操作
System.out.println("包子做好了,顾客1开吃!");
System.out.println("------------");
}
}
}
}).start(); // 执行
// 创建第二个顾客线程
new Thread(new Runnable() {
@Override
public void run() {
// 保证等待和唤醒只能有一个在执行
// 所以需要使用同步代码块
while (true) { // 死循环
synchronized (obj) {
// 告知老板需要的包子种类和数量
System.out.println("顾客2告知老板需要的包子种类和数量");
// 调用监视器锁的wait方法,进入waiting状态
try { // 捕捉异常
// 5000毫秒之后,无notify唤醒,自动醒
obj.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
// 唤醒之后的操作
System.out.println("包子做好了,顾客2开吃!");
System.out.println("------------");
}
}
}
}).start(); // 执行
// 创建一个老板线程(生产者)
new Thread(new Runnable() {
@Override
public void run() {
// 同步代码块
while (true) {
// 唤醒顾客,吃包子
try {
// 花5秒做包子
Thread.sleep(5000L); // long型
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (obj) {
System.out.println("5秒到了。包子做好了!");
obj.notify(); // 如果有多个线程在等待,随机唤醒一个
obj.notifyAll(); // 唤醒所有等待线程,方便同步!
}
}
}
}).start();
}
线程间的通信
概念:多个线程在处理同一个资源,但是处理的动作(线程的任务)却不相同
比如∶线程A用来生成包子的,线程B用来吃包子的,包子可以理解为同一资源,线程A与线程B处理的动作,一个是生产,一个是消费,那么线程A与线程B之间就存在线程通信问题

为什么要处理线程间通信:
多个线程并发执行时,在默认情况下CPU是随机切换线程的,当我们需要多个线程来共同完成一件任务,并且我们希望他们有规律的执行,那么多线程之间需要一些协调通信,以此来帮我们达到多线程共同操作一份数据
如何保证线程间通信有效利用资源︰
多个线程在处理同一个资源,并且任务不同时,需要线程通信来帮助解决线程之间对同一个变量的使用或操作
就是多个线程在操作同一份数据时,避免对同一共享变量的争夺。也就是我们需要通过一定的手段使各个线程能有效的利用资源。而这种手段即—―等待唤醒机制
Object类中wait带参方法和notifyAll方法和线程间通信的更多相关文章
- Object类中wait代餐方法和notifyAll方法和线程间通信
Object类中wait代餐方法和notifyAll方法 package com.yang.Test.ThreadStudy; import lombok.SneakyThrows; /** * 进入 ...
- java线程学习之notify方法和notifyAll方法
notify(通知)方法,会将等待队列中的一个线程取出.比如obj.notify();那么obj的等待队列中就会有一个线程选中并且唤醒,然后被唤醒的队列就会退出等待队列.活跃线程调用等待队列中的线程时 ...
- Android中Looper的quit方法和quitSafely方法
Looper是通过调用loop方法驱动着消息循环的进行: 从MessageQueue中堵塞式地取出一个消息.然后让Handler处理该消息,周而复始.loop方法是个死循环方法. 那怎样终止消息循环呢 ...
- 关于Object类的equals方法和hashCode方法
关于Object类的equals的特点,对于非空引用: 1.自反性:x.equals(x) return true : 2.对称性:x.equals(y)为true,那么y.equals(x)也为tr ...
- equals()方法和hashCode()方法详解
equals()方法和hashCode()方法详解 1. Object类中equals()方法源代码如下所示: /** * Object类中的equals()方法 */ public boolean ...
- sleep()方法和wait()方法的区别? sleep()方法和yield()方法的区别?
sleep()方法和wait()方法的区别? sleep方法是Thread的静态方法,wait方法是Object类的普通方法 sleep方法不释放同步锁,wait方法释放同步锁(执行notify方法唤 ...
- flush方法和close方法的区别
package com.yhqtv.demo05.Writer; import java.io.FileWriter; /* * @author XMKJ yhqtv.com Email:yhqtv@ ...
- 线程间通信(等待,唤醒)&Java中sleep()和wait()比较
1.什么是线程间通信? 多个线程在处理同一资源,但是任务却不同. 生活中栗子:有一堆煤,有2辆车往里面送煤,有2辆车往外拉煤,这个煤就是同一资源,送煤和拉煤就是任务不同. 2.等待/唤醒机制. 涉及的 ...
- Junit 注解 类加载器 .动态代理 jdbc 连接池 DButils 事务 Arraylist Linklist hashset 异常 哈希表的数据结构,存储过程 Map Object String Stringbufere File类 文件过滤器_原理分析 flush方法和close方法 序列号冲突问题
Junit 注解 3).其它注意事项: 1).@Test运行的方法,不能有形参: 2).@Test运行的方法,不能有返回值: 3).@Test运行的方法,不能是静态方法: 4).在一个类中,可以同时定 ...
随机推荐
- 运行npm install命令的时候会发生什么?
摘要:我们日常在下载第三方依赖的时候,都会用到一个命令npm install,那么你知道,在运行这个命令的时候都会发生什么吗? 本文分享自华为云社区<运行npm install命令的时候会发生什 ...
- 普罗米修斯!Ubuntu下prometheus监控软件安装使用
*Prometheus* 是一个开源的服务监控系统和时间序列数据库 官方网站:prometheus.io 一.安装prometheus cd /usr/local/ #进入安装目录 wg ...
- Homomorphic Evaluation of the AES Circuit:解读
之前看过一次,根本看不懂,现在隔这么久,再次阅读,希望有所收获! 论文版本:Homomorphic Evaluation of the AES Circuit(Updated Implementati ...
- 攻防世界-MISC:如来十三掌
这是攻防世界新手练习区的第三题,题目如下: 点击附件1下载,打开后内容如下: 没看懂是什么,还是参考一下WP吧.WP说去一个叫"与佛论禅"的网站,登进去后 发现是一个加解密网站,将 ...
- 安装与基本配置DHCP服务器
一,安装DHCP服务器角色 1,打开[开始]→[管理工具]→[服务器管理器]→"仪表板"选项的[添加角色和功能],持续单机[下一步]按钮, 直至出现下图所示的"选择服务器 ...
- 红旗 Linux 桌面操作系统11来了:支持国产自主CPU,全新UI风格设计,兼容面广...
链接:https://reurl.cc/g8ke9X 红旗Linux桌面操作系统11将于1月10日开放预览版的下载,新版本具有良好的硬件兼容,支持多款国产自主CPU品牌,同时还具有丰富的外设支持及海量 ...
- css实现气泡提示框三角及css中drop-shadow的使用
css 做一个弹出气泡,样式怎么设计? 难点: 要实现白色三角型,可以在伪元素before和after上设置一个黑.一个白三角形,白三角形会挡住黑的,从而实现. &::before, & ...
- 关于 MyBatis-Plus 分页查询的探讨 → count 都为 0 了,为什么还要查询记录?
开心一刻 记得上初中,中午午休的时候,我和哥们躲在厕所里吸烟 听见外面有人进来,哥们猛吸一口,就把烟甩了 进来的是教导主任,问:你们干嘛呢? 哥们鼻孔里一边冒着白烟一边说:我在生气 环境搭建 依赖引入 ...
- uniapp中IOS安卓热更新和整包更新app更新
在App.vue中 onLaunch: function() { console.log('App Launch'); // #ifdef APP-PLUS this.getVersion(); // ...
- 有了 Promise 和 then,为什么还要使用 async?
有了 Promise 和 then,为什么还要使用 async? 本文写于 2020 年 5 月 13 日 最近代码写着写着,我突然意识到一个问题--我们既然已经有了 Promise 和 then,为 ...