等待唤醒机制代码实现_包子类&包子铺类和等待唤醒机制代码实现_吃货类&测试类
资源类:包子类
设置包子的属性
皮
陷
包子的状态:有 true 没有 false
public class BaoZi { //皮 String pi; //陷 String xian; //包子的状态,有 true ,没有 false,设置初始值为false没有包子 boolean flag = false; }
生产者(包子铺)类:是一个线程类,可以继承Thread
设置线程任务(run):生产包子
对包子的状态进行判断
true:有包子
包子铺调用wait方法进入等待状态
false:没有包子
包子铺生产包子
增加一些趣味性:交替生产两种包子
有两种状态(i%2 ==0):
包子铺生产好了包子
修改包子额状态为true:有
唤醒吃货线程,让吃货线程吃包子
注意:
包子铺线程和包子线程关系 --> 通信(互斥)
必须同时同步技术保证两个线程只能有一个在执行
锁对象必须保证唯一,可以使用包子对象作为锁对象
包子铺类和吃货的类必须把包子对象作为参数传递进来
1.需要在成员位置创建一个包子变量
2.使用带参数构造方法,为这个包子变量赋值
public class BaoZiPu extends Thread { //1.需要在成员位置创建一个包子变量 private BaoZi bz; //2.使用带参数构造方法,为这个包子变量赋值 public BaoZiPu(BaoZi bz) { this.bz = bz; } //重写run方法,目的就是生产包子 @Override public void run() { //定义一个变量 int count = 0; //增加一个死循环,反复执行,让包子铺一直生产包子 while (true) { //必须同时同步技术保证两个线程只能有一个在执行 synchronized (bz) { //对包子的状态进行判断 if (bz.flag == true) { //包子铺调用wait方法进入等待状态 try { bz.wait(); } catch (InterruptedException e) { e.printStackTrace(); } } //被唤醒之后执行,包子铺生产包子 //增加一些趣味性:交替生产两种包子 if (count % 2 == 0) { //生产 薄皮肉馅包子 bz.pi = "薄皮"; bz.xian = "肉馅"; } else { //生产 冰皮奶黄包子 bz.pi = "冰皮"; bz.xian = "奶黄"; } count++; System.out.println("包子铺正在生产" + bz.pi + bz.xian + "包子"); //生产包子需要3秒钟 try { Thread.sleep(3000); } catch (InterruptedException e) { e.printStackTrace(); } //包子铺生产好了包子,修改包子额状态为true:有 bz.flag = true; //唤醒吃货线程,让吃货线程吃包子 bz.notify(); System.out.println("包子铺已经生产好了" + bz.pi + bz.xian + "包子,吃货可以开吃了"); } } } }
消费类 ( 吃 货 )类:是一个线程类,可以继承Thread
设置线程任务(run):吃包子
对包子的状态进行判断
false:没有包子
吃货线程调用wait方法进入等待状态
true:有包子
吃货吃包子
吃货吃完包子
修改包子的状态为false 没有
吃货唤醒包子铺线程,生产包子
public class ChiHuo extends Thread { //1.需要在成员位置创建一个包子变量 private BaoZi bz; //2.使用带参数构造方法,为这个包子变量赋值 public ChiHuo(BaoZi bz) { this.bz = bz; } @Override public void run() { //使用死循环,让吃货一直吃包子 while (true) { //必须同时同步技术保证两个线程只能有一个在执行 synchronized (bz) { //对包子的状态进行判断 if (bz.flag == false) { //吃货线程调用wait方法进入等待状态 try { bz.wait(); } catch (InterruptedException e) { e.printStackTrace(); } } //被唤醒之后执行的代码,吃包子 System.out.println("吃货正在吃" + bz.pi + bz.xian + "吃包子"); //吃货吃完包子,修改包子的状态为false 没有 bz.flag = false; //吃货唤醒包子铺线程,生产包子 bz.notify(); System.out.println("吃货已经把" + bz.pi + bz.xian + "包子吃完了,包子铺可以开生产包子了"); System.out.println("----------------------------------------------"); } } } }
测试类:
包含main方法,程序执行的入口,启动程序
创建包子对象,创建包子铺线程,生产包子
创建吃货线程,开启,吃包子
public class Demo { public static void main(String[] args) { //创建包子类对象, BaoZi bz = new BaoZi(); //创建包子铺线程,生产包子 new BaoZiPu(bz).start(); //创建吃货线程,吃包子 new ChiHuo(bz).start(); } }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)