等待唤醒机制需求分析和等待唤醒机制代码实现
等待唤醒机制需求分析
分析: 需要哪些类
资源类: 包子类
设置包子的属性(皮,馅,包子的状态:有true ,没有false)
生产者(包子铺)类:是一个线程类,可以继承Thread
设置线程任务(run):生产包子
对包子的状态进行判断
true: 有包子,包子铺调用wait方法进入等待状态
false: 没有包子, 包子铺产生包子,增加一些趣味性: 交替生产两种包子
有两种状态(i%2==0)
包子铺产生好了包子, 修改包子的状态为true有唤醒吃货线程,让吃货线程吃包子
消费者(吃货)类:是一个线程类,可以继承Thread
设置线程任务(run): 吃包子,对包子的状态进行判断
false: 没有包子,吃货线程调用wait方法进入等待状态
true: 有包子,吃货吃包子, 吃货吃完包子, 修改包子的状态为false没有,吃货唤醒包子铺线程,生产包子
测试类:
包含main方法,程序执行的入口,启动程序.
创建包子对象:创建包子铺线程,开启;创建吃货线程,开启
等待唤醒机制代码实现
public class BaoZi { //皮 String pi; //馅 String xian; //包子的状态: 有true, 没有 false boolean flag = false; }
public class BaoZiPu extends Thread{ 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){ 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+"包子"); //2秒来生产包子 try { Thread.sleep(3000); } catch (InterruptedException e) { e.printStackTrace(); } bz.flag = true; bz.notify(); System.out.println("包子铺已经做好了:"+bz.pi+bz.xian+"包子,可以开始进行吃了"); } } } }
public class ChiHuo extends Thread{ private BaoZi bz; public ChiHuo (BaoZi bz){ this.bz = bz; } @Override public void run() { while (true){ synchronized (bz){ if (bz.flag==false){ try { bz.wait(); } catch (InterruptedException e) { e.printStackTrace(); } } System.out.println("吃货正在吃:"+bz.pi+bz.xian+"的,包子"); bz.flag = false; bz.notify(); System.out.println("吃货已经把:"+bz.pi+bz.xian+"的包子吃完了,包子铺开始生产包子"); System.out.println("========================="); } } } }
public class DTests { public static void main(String[] args) { BaoZi bz = new BaoZi(); new BaoZiPu(bz).start(); new ChiHuo(bz).start(); } }