等待唤醒机制代码实现-包子类&包子铺类和吃货类&测试类
等待唤醒机制代码实现-包子类&包子铺类
资源类:
包子类设置包子的属性
皮
陷
包子的状态:有true,没有false
包子类
public class BaoZi { //皮 String pi; //陷 String xian; //包子的状态,有true,没有false,设置初始值为false boolean flag = false; }
包子铺
public class BaoZiPu extends Thread{ /* 生产者(包子铺)类:是一个线程类,可以继承Thread设置线程任务(run):生产包子 对包子的状态进行判断 true:有包子 包子铺调用wait方法进入等待状态 false:没有包子 包子铺生产包子 增加一些趣味性:交替生产两种包子 有两种状态(i%2==) 包子铺生产好了包子 修改包子的状态为true有 唤醒吃货线程,让吃货线程吃包子 注意: 包子铺线程和包子线程关系-->通信(互斥) 必须同时同步技术保证两个线程只能有一个在执行锁对象必须保证唯一,可以使用包子对象作为锁对象 包子铺类和吃货的类就需要把包子对象作为参数传递进来 1.需要在成员位置创建一个包子变量 2.使用带参数构造方法,为这个包子变量赋值 */ //需要在成员位置创建一个包子变量 private BaoZi bz; //使用带参数构造方法,为这个包子变量赋值 public BaoZiPu(BaoZi bz) { this.bz = bz; } //设置线程任务:生产包子 @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+"包子。吃货可以开始吃了"); } } } }
等待唤醒机制代码实现-吃货类&测试类
吃货类
public class ChiHuo extends Thread{ /* 消费者(吃货)类:是一个线程类,可以继承Thread设置线程任务(run):吃包子 对包子的状态进行判断 false:没有包子 吃货调用wait方法进入等待状态 true:有包子 吃货吃包子吃货吃完包子 修改包子的状态为false没有吃货唤醒包子铺线程,生产包子 */ private BaoZi bz; public ChiHuo(BaoZi bz) { this.bz = bz; } @Override public void run() { //使用死循环,让吃货一直吃包子 while (true){ //必须同时同步技术保证两个线程只能有一个在执行 synchronized (bz){ //对包子的状态进行判断 if (bz.flag==false){ try { //吃货调用wait方法进入等待状态 bz.wait(); } catch (InterruptedException e) { e.printStackTrace(); } } //被唤醒之后执行的代码,吃包子 System.out.println("吃货正在吃:"+bz.pi+bz.xian+"的包子"); //吃货吃完包子 //修改包子的状态为false bz.flag=false; //吃货唤醒包子线程,生产包子 System.out.println("吃货已经把:"+bz.pi+bz.xian+"的包子吃完 了,包子铺开始生产包子"); System.out.println("======================================"); } } } }
测试类
public static void main(String[] args) { //创建包子对象 BaoZi baoZi = new BaoZi(); //创建包子线程,开启,生产包子 new BaoZiPu(baoZi).start(); //创建吃货线程,开启,开吃包子 new ChiHuo(baoZi).start(); }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix