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();
}
}
为啥还会死锁啊?大神帮帮看一下
|
|