标题:while循环死锁问题,告急!!
取消只看楼主
huang1231
Rank: 1
等 级:新手上路
帖 子:2
专家分:0
注 册:2020-2-5
结帖率:0
已结贴  问题点数:20 回复次数:1 
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();


    }
}
搜索更多相关主题的帖子: while 对象 线程 public 变量 
2020-02-05 13:25
huang1231
Rank: 1
等 级:新手上路
帖 子:2
专家分:0
注 册:2020-2-5
得分:0 
回复 楼主 huang1231
这是运行结果


2020-02-05 13:27



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-499107-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.149503 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved