等待唤醒机制的实现
以包子的加工及其买卖作为案例实现
1.列举出包子的属性
/*
包子的属性
皮
馅
状态(有或无)
*/
public class Baozi{
String pi;
String xian;
boolean zhuangtai=false;
}
2.生产包子(包子铺类)
//包子铺类
public class Baozipu extends Thread{
//设置一个包子变量
private Baozi bz;
//定义一个带参数的方法,为包子变量进行赋值
public Baozipu(Baozi bz) {
this.bz = bz;
}
//设置线程任务,重写run方法
//包子和包子铺线程,二者互斥,只能有一个在执行,需要用到同步技术
@Override
public void run() {
//设置一个死循环让包子铺一直生产包子
while(true){//使用同步技术
//定义一个变量
int l=0;
synchronized (bz){
//对包子的状态进行判断
if(bz.zhuangtai==true){//让包子铺进行等待机制
try {
bz.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
//唤醒后,让包子铺生产包子
//设置俩种不同类型的包子,让其交替生产
if(l%2==0){
bz.pi="薄皮";
bz.xian="三鲜馅";
}else{
bz.pi="冰皮";
bz.xian="牛肉馅";
}
l++;
System.out.println("包子铺正在生产"+bz.pi+bz.xian+"的包子");
//生产包子需要5秒钟时间,让包子铺线程休眠
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
//包子做好后,修改包子的状态
bz.zhuangtai=true;
//唤醒吃货线程,让其吃包子
bz.notify();
System.out.println("包子铺已做好"+bz.pi+bz.xian+"的包子,吃货可以开吃了");
}
}
}
}
3.包子的吃与留(吃货类)
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.zhuangtai == false) {//对包子的状态进行判断
//吃货线程进行等待
try {
bz.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
//被唤醒后,让其吃包子
System.out.println("吃货正在吃"+bz.pi+bz.xian+"的包子");
//包子吃完后,修改包子的状态
bz.zhuangtai=false;
//吃货线程唤醒包子线程,让包子线程生产包子
bz.notify();
System.out.println("吃货已经吃完"+bz.pi+bz.xian+"的包子,包子铺开始生产包子");
System.out.println("--------------------------------------------");
}
}
}
}
4.包子铺线程和吃货线程的实现
public class DemoMain {
public static void main(String[] args) {
//创建包子对象
Baozi bz = new Baozi();
//创建包子铺线程,开始生产包子
new Baozipu(bz).start();
//创建吃货线程,开始吃包子
new Chihuo(bz).start();
}
}