java学习笔记5——等待唤醒机制

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

创建一个顾客线程(消费者):告知老板要的包子的种类和数量,调用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方法,程序执行的入口,启动程序
创建包子对象;
创建包子铺线程,开启,生产包子;
创建吃货线程,开启,吃包子;

在这里插入图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值