黑马程序员技术交流社区

标题: 多线程等待叫醒机制 [打印本页]

作者: huozhe135    时间: 2017-10-29 09:07
标题: 多线程等待叫醒机制
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();
        }
}
为啥还会死锁啊?大神帮帮看一下

作者: huozhe135    时间: 2017-10-29 09:07
大神们帮帮忙啊?




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2