A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

huozhe135

初级黑马

  • 黑马币:33

  • 帖子:12

  • 精华:0

© huozhe135 初级黑马   /  2017-10-29 09:07  /  740 人查看  /  1 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

public class Zuo implements Runnable {
        // 定义一个包子类型的变量
        private BaoZi b;
        // 定义一个构造方法需传入一个包子对象
        public Zuo(BaoZi b) {
                // 把传入的包子对象赋值给本类的包子变量使用
                this.b = b;
        }
        @Override
        public void run() {
                int i = 0;
                while (true) {
                        synchronized (b) {
                                // 开始有没有做出来的包子
                                if (b.isFlag()) {
                                        // 如果有做好的包子就等待
                                        try {
                                                b.wait();
                                        } catch (InterruptedException e) {
                                                e.printStackTrace();
                                        }
                                } else {
                                        // 如果没有就开始做包子
                                        if (i == 0) {
                                                b.setName("包子");
                                                b.setColor("绿色");
                                        }
                                        if (i == 1) {
                                                b.setName("馒头");
                                                b.setColor("红色");
                                        }
                                        i = ++i % 2;
                                        // 座好了包子告诉吃包子的有包子了
                                        b.setFlag(true);
                                        // 改完标记叫醒等待的线程吃包子
                                        b.notify();
                                }
                        }
                }
        }
}

public class Chi implements Runnable {
        // 定义一个包子变量
        private BaoZi b;
        // 定义一个构造方法传入一个包子对象
        public Chi(BaoZi b) {
                // 把传入的包子对象赋值给本类的包子变量
                this.b = b;
        }
        @Override
        public void run() {
                synchronized (b) {
                        // 判断有没有包子
                        if (!b.isFlag()) {
                                // 没有就等等
                                try {
                                        b.wait();
                                } catch (InterruptedException e) {
                                        e.printStackTrace();
                                }
                        } else {
                                // 有就开始吃
                                System.out.println(b.toString());
                                // 吃完后告诉做包子的人包子没了
                                b.setFlag(false);
                                // 叫醒他赶紧做
                                b.notify();
                        }
                }
        }
}

public class TestBaoZi {
        public static void main(String[] args) {
                //创建包子对象
                BaoZi b = new BaoZi();
                //创建做包子人和吃包子人对象
                Zuo z = new Zuo(b);
                Chi c = new Chi(b);
                //创建线程对象
                Thread th1 = new Thread(z,"张三");
                Thread th2 = new Thread(c,"李四");
                //开启线程
                th1.start();
                th2.start();
        }
}
为啥还会死锁啊?大神帮帮看一下

1 个回复

倒序浏览
大神们帮帮忙啊?
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马