等待唤醒案例分析:线程之间的通信

创建一个顾客线程(消费者):告知老板要的包子的种类和数量,调用wait方法,放弃cpu的执行,进入到WAITING状态(无限等待)
创建一个老板线程(生产者):花了5秒做包子,做好包子之后,调用notify方法,唤醒顾客吃包子

注意:
顾客和老板线程必须使用同步代码块包裹起来,保证等待和唤醒只能有一个在执行
同步使用的锁对象必须保证唯一
只有锁对象才能调用wait和notify方法

Obejct类中的方法
Void wait()
在其他线程调用此对象的notify()方法或notifyAll()方法前,导致当前线程等待
Void notify()
唤醒在此对象监视器上等待的单个线程
会继续执行wait方法之后的代码

Object类中wait带参方法和notify
进入到TimeWaiting(计时等待)有两种方式:
1、使用sleep(long m)方法,在毫秒值结束之后,线程睡醒进入到Runnable/Blocked状态
2、使用wait(long m)方法,wait方法如果在毫秒值结束之后,还没有被notify唤醒,就会自动醒来,线程睡醒进入到Rummable/Blocked状态

调用wait和notify方法需要注意的细节:
1、wait方法和notify方法必须要由同一个锁对象调用。因为:对应的锁对象可以通过notify唤醒使用同一个锁对象调用的wait方法后的线程。
2、Wait方法和notify方法是属于Object类的方法的。因为:锁对象可以是任意对象,而任意对象的所属类都是继承了Object类的。
3、Wait方法和notify方法必须要在同步代码块或者是同步函数中使用的。因为:必须通过锁对象调用这2个方法。
唤醒方法:
Void notify()唤醒在此对象监视器上等待的单个线程。
Void notifyAll()唤醒在此对象监视器上等待的所有线程。

线程间通信

1、为什么要处理线程间通信?
多个线程并发执行时候,在默认情况下CPU是随机切换线程的,当我们需要多个线程来共同完成一件任务,并且我们希望他们有规律的执行,那么多线程之间需要一些协调通信,以此来帮我们达到多线程共同操作一份数据。

2、如何保证线程间通信有效利用资源?
多个线程在处理同一个资源,并且任务不同时,需要线程通信来帮助解决线程之间对同一个变量的使用或操作。就是多个线程在操作同一份数据时,避免对同一共享变量的争夺。也就是我们需要通过一定的手段使各个线程能有效的利用资源。而这种手段即————等待唤醒机制

等待唤醒机制代码实现_包子类和吃货类
分析:需要哪些类
资源类:包子类
设置包子属性:
皮
馅
包子的状态:有true,没有false生产者(包子铺):是一个线程类,可以继承Thread
设置线程任务(run):生产包子
对包子的状态进行判断
true:有包子包子铺调用wait方法进入等待状态
false:没有包子包子铺生产包子增加一些趣味性:交替生产两种包子有两种状态(i%2==0)包子铺生产好了包子修改包子的状态为true有唤醒吃货线程,让吃货线程吃包子

注意:

包子铺线程和包子线程关系:通信(互斥)必须同时同步技术保证两个线程只能有一个在执行锁对象必须保证唯一,可以使用包子对象作为锁对象包子铺类和吃货类就需要把包子对象作为参数传递进来1、需要在成员位置创建一个包子变量2、使用带参数构造方法,为这个包子变量赋值
消费者(吃货)类:是一个线程类,可以继承Thread
设置线程任务(run):吃包子
对包子的状态进行判断
false:没有包子吃货吃包子吃货吃完包子修改包子的状态为false没有吃货唤醒包子铺线程,生产包子
测试类:
包含main方法,程序执行的入口,启动程序
创建包子对象;
创建包子铺线程,开启,生产包子;
创建吃货线程,开启,吃包子;

锁 唤醒_Java笔记|等待唤醒机制相关推荐

  1. java 等待 唤醒_Java之等待唤醒机制的代码实现

    各位小伙伴们大家好,在之前的文章中,小编陆陆续续讲了很多关于线程还有等待唤醒机制的一些知识,这次小编要讲的是等待唤醒机制的代码实现. 就用快递员送快递,我们取快递来举例,首先要进行需求分析.主要有两个 ...

  2. Java——线程锁,死锁,等待唤醒机制

    一.线程锁 线程安全问题 其实,线程安全问题都是由全局变量及静态变量引起的.若每个线程中对全局变量.静态变量只有读操作,而无写操作,一般来说,这个全局变量是线程安全的:若有多个线程同时执行写操作,一般 ...

  3. java notify 唤醒_java notify()的唤醒

    在线程等待的间隙,其他的线程会进行唤醒的操作,这时候我们要用的notify()方法来进行处理.当notify()结束线程的唤醒工作,才会进行下一步的wait方法,也就是说notify()也可以结合wa ...

  4. 27_多线程_第27天(线程安全、线程同步、等待唤醒机制、单例设计模式)_讲义...

    今日内容介绍 1.多线程安全问题 2.等待唤醒机制 01线程操作共享数据的安全问题 *A:线程操作共享数据的安全问题如果有多个线程在同时运行,而这些线程可能会同时运行这段代码.程序每次运行结果和单线程 ...

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

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

  6. 多线程的等待唤醒机制

    一把锁一把钥匙..就是等待跟唤醒要在同一锁内 /* 多线程的等待唤醒机制 wait(); noyify();*/ class Pes {String name;String sex;boolean f ...

  7. 27_多线程_第27天(线程安全、线程同步、等待唤醒机制、单例设计模式)

    今日内容介绍 1.多线程安全问题 2.等待唤醒机制 01线程操作共享数据的安全问题 *A:线程操作共享数据的安全问题如果有多个线程在同时运行,而这些线程可能会同时运行这段代码.程序每次运行结果和单线程 ...

  8. Java线程等待唤醒机制(加深理解)

    今天看源码的时候遇到这样一个场景,某线程里面的逻辑需要等待异步处理结果返回后才能继续执行.或者说想要把一个异步的操作封装成一个同步的过程.这里就用到了线程等待唤醒机制,下面具体看一下. 等待唤醒机制示 ...

  9. java sleep唤醒_Java中的等待唤醒机制—至少50%的工程师还没掌握!

    Java中的等待唤醒机制-至少50%的工程师还没掌握! 发布时间:2019-12-14 01:53, 浏览次数:222 , 标签: Java 这是一篇走心的填坑笔记,自学Java的几年总是在不断学习新 ...

最新文章

  1. web个人主页制作代码_关于嵌入式web服务器
  2. iOS开发中didSelectRowAtIndexPath tap事件响应延迟
  3. Java面试宝典系列之基础面试题-常见的几种排序算法-插入、选择、冒泡、快排、堆排等
  4. yjv是电缆还是电线_BVV属于电线还是电缆?
  5. 关于tensorflow和keras那些事儿
  6. Delphi中DLL或Package窗体载入与显示
  7. C#创建WinForm应用程序的入口点
  8. 教你如何计算腰围~~
  9. 向Redis中存入JSON格式数据
  10. C语言学习系列(六)基本语法
  11. 剑指offer——面试题11:数值的整数次方
  12. sublime3中文乱码解决包ConvertToUTF8.zip
  13. Debian — command not found
  14. 背景虚化_背景虚化的效果用手机怎么拍?原来这样简单
  15. spring-第七篇之深入理解容器中的bean
  16. 天地图JS API制作专题图
  17. 这个录屏神器好用哭了!
  18. Win7,一次性修改所有文件夹图标
  19. 实现字符串倒序并输出
  20. 第八节 Electron主进程和渲染进程之间的通信

热门文章

  1. 经典面试题(37):以下代码将输出的结果是什么?
  2. 经典面试题(29):以下代码将输出的结果是什么?
  3. 探讨SEO与前端:使用display:none对seo的影响
  4. 计算机硬盘共享配额,Win10磁盘配额是什么,怎么用?
  5. OpecCV颜色分割
  6. 带你走进和声搜索算法(Harmony search )的世界!
  7. 1.13 编程基础之综合应用 12 分数求和 4分 python
  8. 1.5编程基础之循环控制_41数字统计
  9. 第33课 打擂台 《小学生C++趣味编程》
  10. 【docker】第二节:安装nginx、mysql、php