while循环死锁问题,告急!!
求哪位大神帮我看看,为什么我程序运行的时候,只能循环一两次就不行了,上网查了查,说是死锁了。求解!!!
包子属性:
程序代码:
package cn.hxl.day17; /* 设置包子的属性 皮 馅 包子的状态,有为true,没有为false */ public class baozi { // 皮 String pi; // 馅 String xian; // 包子的状态,默认为没有 boolean flag = false; }
包子铺类:
程序代码:
package cn.hxl.day17; /* 包子铺线程类的实现,,继承Thread */ public class baozipu extends Thread { // 创建一个包子类型的变量 private baozi bz; // 使用带有参数的构造方法,给包子变量赋值 public baozipu(baozi bz) { this.bz = bz; } // 设置线程任务(run)用变量bz作为锁对象 @Override public void run() { // 定义一个变量 int count = 0; // 加上while循环,让包子铺一直生产包子 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(); } // 修改包子状态 bz.flag = true; // 唤醒吃货线程,让吃货吃包子 bz.notify(); System.out.println("包子铺生产好" + bz.pi + bz.xian + "的包子了,吃货可以开始吃了"); } } } }
吃包子类:
程序代码:
package cn.hxl.day17; /* 吃货类的实现,线程类,继承与Thread */ public class chihuo extends Thread { // 定义一个包子类型的变量 private baozi bz; // 使用带有参数的构造方法,给包子变量赋值 public chihuo(baozi bz) { this.bz = bz; } // 重写run方法,设置线程任务 @Override public void run() { //使用死循环,让吃货一直吃包子 while(true){ // 两个线程类必须使用同一个锁对象 synchronized (bz){ // 判断有没有包子(没有) if(bz.flag==true){ //被唤醒 吃货吃包子 System.out.println("吃货开始吃"+bz.pi+bz.xian+"的包子"); //吃完包子,修改包子的状态 // 并且唤醒包子铺 bz.flag=false; bz.notify(); System.out.println("吃货已经把"+bz.pi+bz.xian+"的包子吃完了,包子铺开始生产包子"); System.out.println("========================================================"); } try { bz.wait(); } catch (InterruptedException e) { e.printStackTrace(); } } } } }
主程序:
程序代码:
package cn.hxl.day17; /* 测试类,主程序调用两个类 */ public class usebaozi { public static void main(String[] args) { // 创建包子对象 baozi bz = new baozi(); // 创建包子铺线程对象,传递包子对象 new baozipu(bz).start(); // 创建吃货线程对象,传递包子对象 new chihuo(bz).start(); } }