1 package baozi; 2 3 /* 4 生产者(包子铺)类:是一个 线程类,继承Thread 5 设置线程任务(run):生产包子 6 对包子 进行判断 7 true:有包子 8 包子铺调用wait方法进入等待状态 9 false : 没有包子 10 包子铺生产包子 11 交替生产两种包子 12 有两种状态(i%2==0) 13 包子铺生产两种包子 14 修改包子的状态为true有 15 唤醒吃货线程,让吃货线程吃包子 16 17 注意: 18 包子铺线程和包子线程关系-->通信(互斥) 19 锁对象必须保证唯一,可以使用包子对象作为锁对象 20 包子铺类和吃货的类 就需要把保安资质对象作为参数传递进来 21 1,需要在成员位子创建一个包子变量 22 2,使用带参数构造方法。为这个包子变量赋值 23 24 */ 25 public class BaoZIPu extends Thread { 26 private BaoZi bz; 27 28 public BaoZIPu(BaoZi bz){ 29 this.bz=bz; 30 } 31 32 @Override 33 public void run() { 34 int count = 0; 35 while (true) { 36 //同步技术 37 synchronized (bz) { 38 //判断有没有包子 39 if (bz.flag == true) { 40 //包子铺调用wait反法进入等待状态 41 try { 42 bz.wait(); 43 } catch (InterruptedException e) { 44 e.printStackTrace(); 45 } 46 } 47 //被唤醒之后执行,包子铺生产包子 48 //生产两种包子 49 if (count % 2 == 0) { 50 bz.pi = "薄皮"; 51 bz.xian = "猪肉"; 52 } else { 53 bz.pi = "厚皮"; 54 bz.xian = "牛肉"; 55 } 56 count++; 57 System.out.println("包子铺正在生产" + bz.pi + bz.xian + "的包子"); 58 try { 59 Thread.sleep(1000); 60 } catch (InterruptedException e) { 61 e.printStackTrace(); 62 } 63 //包子铺生产好了包子 64 //修改包子的状态为true 65 bz.flag = true; 66 //唤醒吃货线程,让吃货线程吃包子 67 bz.notify(); 68 System.out.println("包子铺已经生产好了" + bz.pi + bz.xian + "的包子,吃货可以开始吃了"); 69 } 70 } 71 } 72 }
1 package baozi; 2 3 /* 4 设置包子的属性 5 皮 6 馅 7 包子的状态:有 true 没有 false 8 */ 9 public class BaoZi { 10 String pi; 11 String xian ; 12 //包子的状态 有 true 没有 fasle 13 boolean flag =false; 14 }
1 package baozi; 2 3 import baozi.BaoZi; 4 5 public class ChiHuo extends Thread { 6 private BaoZi bz; 7 public ChiHuo(BaoZi bz){ 8 this.bz=bz; 9 } 10 @Override 11 public void run() { 12 while(true){ 13 synchronized (bz){ 14 if (bz.flag==false){ 15 try { 16 bz.wait(); 17 } catch (InterruptedException e) { 18 e.printStackTrace(); 19 } 20 } 21 //被唤醒后执行的代码 ,吃包子 22 System.out.println("吃货正在吃"+bz.pi+bz.xian+"的包子"); 23 bz.flag=false; 24 bz.notify(); 25 System.out.println("吃货已经把"+bz.pi+bz.xian+"的包子出完了,包子铺开始生产包子 "); 26 System.out.println("++++++++++++++"); 27 } 28 } 29 } 30 }
1 package baozi; 2 3 import baozi.BaoZIPu; 4 import baozi.BaoZi; 5 import baozi.ChiHuo; 6 7 public class Main { 8 public static void main(String[] args) { 9 BaoZi bz = new BaoZi(); 10 //创建包子铺线程,开始生产包子 11 new BaoZIPu(bz).start(); 12 //创建吃货线程,开启,吃包子 13 new ChiHuo(bz).start(); 14 } 15 16 }
运行代码👇