wait(), notify(), notifyAll() 方法

(1) 语法上: 都必须在 synchronized 修饰的代码块中, 如果没在, 就会抛出异常.
(2) 作用: 由于在 synchronized 修饰的代码块中, 所以线程一定是运行态, 且已经成功获取到对象锁.


下面举一个面包店的例子来进行说明 线程间的通信

package Java05_23;// 假设面包店有面包师傅有5个, 可以一直生产面包, 每次生产3个
// 假设面包店有20个消费者, 可以一直消费面包, 每次消费1个
// 假设面包店库存上限是100个, 下限是0public class SignalTest {// 库存private static int SUM;public static void main(String[] args) {// 5个面包师傅, 同时启动for (int i = 0; i < 5; i++) {new Thread(new Runnable() {@Overridepublic void run() {try {while (true) {synchronized (SignalTest.class) {if (SUM + 3 > 100) {SignalTest.class.wait();} else {SUM += 3;System.out.println(Thread.currentThread().getName() + "生产了面包, 库存:" + SUM);Thread.sleep(500);SignalTest.class.notify();}}Thread.sleep(200);}} catch (InterruptedException e) {e.printStackTrace();}}}, "面包师傅[" + i + "] 号").start();}// 20个消费者, 同时启动for (int i = 0; i < 20; i++) {new Thread(new Runnable() {@Overridepublic void run() {try {while (true) {synchronized (SignalTest.class) {if (SUM == 0) {SignalTest.class.wait();} else {SUM--;System.out.println(Thread.currentThread().getName() + "消费了面包, 库存:" + SUM);Thread.sleep(500);SignalTest.class.notify(); // 随机通知一个 wait 方法阻塞的线程
//                                    SignalTest.class.notifyAll(); // 随机通知全部 wait 方法阻塞的线程}}Thread.sleep(200);}} catch (InterruptedException e) {e.printStackTrace();}}}, "消费者[" + i + "] 号").start();}}
}



画图来详细描述一下这个过程



再在生产者的代码中分析一下

wait 和 sleep 的对比

实质上, wait 和 sleep 是没有任何可比性的, 一个是用于线程间的通信的, 一个是让线程阻塞一段时间, 唯一的相同点就是可以让线程放弃执行一段时间.

多线程 ---- 线程的通信相关推荐

  1. 多线程-线程间通信-多生产者多消费者示例

    1.多线程-线程间通信-多生产者多消费者问题 多生产者和多消费者.等待唤醒机制. 产生了两个问题: 1.出现了多次连续生产,未消费,或者一个商品被消费多次. 解决:必须要--------每一个被唤醒的 ...

  2. Java基础学习——多线程(线程间通信-生产者消费者代码示例)

    JDK 1.5提供了多线程升级方案 将同步synchronized替换成了显示的Lock操作.可以实现唤醒.冻结指定的线程. Lock接口 Lock 实现提供了比使用 synchronized 方法和 ...

  3. Java多线程:线程间通信之Lock

    Java 5 之后,Java在内置关键字sychronized的基础上又增加了一个新的处理锁的方式,Lock类. 由于在Java线程间通信:volatile与sychronized中,我们已经详细的了 ...

  4. Java多线程编程-(5)-使用Lock对象实现同步以及线程间通信

    前几篇: Java多线程编程-(1)-线程安全和锁Synchronized概念 Java多线程编程-(2)-可重入锁以及Synchronized的其他基本特性 Java多线程编程-(3)-线程本地Th ...

  5. Java多线程编程-(4)-线程间通信机制的介绍与使用

    上一篇: Java多线程编程-(1)-线程安全和锁Synchronized概念 Java多线程编程-(2)-可重入锁以及Synchronized的其他基本特性 Java多线程编程-(3)-线程本地Th ...

  6. C++多线程编程分析-线程间通信

    上文我们介绍了如何建立一个简单的多线程程序,多线程之间不可避免的需要进行通信.相比于进程间通信来说,线程间通信无疑是相对比较简单的. 首先我们来看看最简单的方法,那就是使用全局变量(静态变量也可以)来 ...

  7. 递归锁、信号量、GIL锁、基于多线程的socket通信和进程池线程池

    递归锁.信号量.GIL锁.基于多线程的socket通信和进程池线程池 递归锁 死锁现象:是指两个或两个以上的进程和线程因抢夺计算机资源而产生的一种互相等待的现象 from threading impo ...

  8. Java多线程:线程间通信之volatile与sychronized

    由前文Java内存模型我们熟悉了Java的内存工作模式和线程间的交互规范,本篇从应用层面讲解Java线程间通信. Java为线程间通信提供了三个相关的关键字volatile, synchronized ...

  9. 多线程之间的通信(等待唤醒机制、Lock 及其它线程的方法)

    一.多线程之间的通信. 就是多个线程在操作同一份数据, 但是操作的方法不同. 如: 对于同一个存储块,其中有两个存储位:name   sex, 现有两个线程,一个向其中存放数据,一个打印其中的数据. ...

最新文章

  1. SQL替换字段中部分字符
  2. OpenCv 009---色彩空间与色彩空间转换
  3. python和java一样吗-Python和Java有什么不一样?
  4. python文件存储过程_python调用MySql存储过程
  5. 对mysql的各种sql语句如何对表加锁的实验
  6. BZOJ3511: 土地划分
  7. php邮件发送tp,Thinkphp5 邮件发送Thinkphp发送邮件
  8. 自动加密可序列化的类
  9. python 太灵活_Python中的灵活参数
  10. android 获取图片上某一个文字位置_android 获取手机中的所有图片或某一目录下的图片方法...
  11. 使用pinyin4j将中文转换为拼音
  12. 兴业银行研发中心笔试题_2021国考笔试成绩即将发布,面试重点考什么?
  13. PRML 模式识别与机器学习 1.绪论
  14. MATLAB自带机器学习算法汇总
  15. 怎样提高平面设计色彩表现力
  16. BZOJ 4216 Pig 分块乱搞
  17. 服装品牌正向多元化全方面的发展
  18. 百度地图安卓版详细接入流程解读(获取密钥详解)
  19. 一口气挑了101个适合程序员玩耍的项目!国庆可以玩的很嗨啦
  20. 初览spring boot读后感

热门文章

  1. 武林外传电影版java,武林外传经典台词
  2. 密度计算机公式,密度计算公式及单位
  3. 我是如何从汇编语言脑残粉转变的
  4. 2.14情人节还是情人劫?海南大宗开户有返佣吗
  5. 如何区别阿里云服务器ECS计算型c6和c6e?
  6. python夯实基础日记-函数详解
  7. 何鸿略加入华为消费者业务 任大中华区副总裁
  8. 大数据核心技术与应用实战峰会(上):大数据在多行业内大放异彩
  9. json.loads与json.load的区别
  10. warning: this decimal constant is unsigned only in ISO C90问题的处理及理解