设置互斥锁包子
当没有包子时,吃货线程等待,包子铺线程运行;
当有包子时,包子铺线程等待,吃货线程运行;
分别对包子,包子铺,吃货三个类进行分析
1. 包子类
设置三个成员变量,用来表示包子属性的有皮和馅,用来形成包子铺和吃货类线程通信的有标志信息,首先设置为没有包子。
2. 包子铺类
包子铺线程继承Thread
成员变量设置包子,并通过构造方法完成包子属性的初始化
成员方法重写run
:保证吃货和包子铺有一个在运行,设置synchronized
代码区;
首先判断包子的状态flag
,是否存在
true
,调用wait()
使线程阻塞
false
,生产包子(这里可以调用sleep模拟,并设置包子的皮和馅)
然后修改包子的状态,释放包子这个互斥锁,使等待的吃货进程可以进行
3. 吃货类
吃货类程继承Thread
成员变量设置包子,并通过构造方法完成包子属性的初始化
成员方法重写run
:保证吃货和包子铺有一个在运行,设置synchronized
代码区;
首先判断包子的状态flag
,是否存在
false
,调用wait()
使线程阻塞
true
,吃包子(这里可以调用sleep模拟,打印包子的皮和馅)
然后修改包子的状态,释放包子这个互斥锁,使等待的包子铺进程可以进行
//包子
package com.itheima.demo01.WaitAndNotify;
public class BaoZi {
String pier;
String xianer;
boolean flag = false;
}
//包子铺
package com.itheima.demo01.WaitAndNotify;
public class BaoZiPu extends Thread {
private BaoZi bz;
public BaoZiPu(BaoZi bz) {
this.bz = bz;
}
@Override
public void run() {
int count = 0;
while (true) {
synchronized (bz) {
//有包子,等待吃货吃完包子当前
if (bz.flag) {
try {
bz.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
//没包子,生产包子
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
if (count % 2 == 0) {
bz.pier = "冰皮";
bz.xianer = "五仁";
} else {
bz.pier = "薄皮";
bz.xianer = "牛肉大葱";
}
count++;
bz.flag = true;
System.out.println("顾客"+count+bz.pier + bz.xianer + "包子造好了!可以吃了!");
bz.notify();
}
}
}
}
//吃货
package com.itheima.demo01.WaitAndNotify;
class ChiHuo extends Thread {
private BaoZi bz;
ChiHuo(BaoZi bz) {
this.bz = bz;
}
@Override
public void run() {
while (true) {
synchronized (bz) {
if (!bz.flag) {
try {
bz.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println("吃货正在吃" + bz.pier + bz.xianer + "包子");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
bz.flag = false;
bz.notify();
System.out.println("包子已经吃完");
System.out.println("============");
}
}
}
}
package com.itheima.demo01.WaitAndNotify;
public class Demo {
public static void main(String[] args) {
BaoZi bz=new BaoZi();
new BaoZiPu(bz).start();
new ChiHuo(bz).start();
}
}
运行结果
顾客1冰皮五仁包子造好了!可以吃了!
吃货正在吃冰皮五仁包子
包子已经吃完
============
顾客2薄皮牛肉大葱包子造好了!可以吃了!
吃货正在吃薄皮牛肉大葱包子
包子已经吃完
============
顾客3冰皮五仁包子造好了!可以吃了!
吃货正在吃冰皮五仁包子
包子已经吃完
============
顾客4薄皮牛肉大葱包子造好了!可以吃了!
吃货正在吃薄皮牛肉大葱包子
包子已经吃完
============
…