题目
/**
* 生产者(包子铺)是一个线程,可以继承Thread类
* 设置线程任务run:生产包子
* ture:有包子
* false:没有包子
* 包子铺生产包子
* 两种口味的包子,交替生产
* 包子铺生产好了包子,修改包子状态为true
* 唤醒吃货线程,让线程吃包子
* <p>
* 注意:
* 包子铺线程和包子关系--->通信(互斥)
* 必须使用同步技术包子两个线程只有一个在执行
* 锁对象必须包子唯一性,
* 可以使用包子对象作为锁对象
* 包子铺类和吃货的类就需要把包子对象作为参数残敌进来
* 1、需要在成员位置创建一个包子的变量
* 2、使用带参构造方法,为包子变量赋值
*/
包子铺类
public class baoZiPu extends Thread {
// 1、需要在成员位置创建一个包子的变量
private Baozi bz;
//2、使用带参构造方法,为包子变量赋值
public baoZiPu(Baozi bz) {
this.bz = bz;
}
//设置线程任务run:生产包子
@Override
public void run() {
//定义一个变量
int count = 0;
//让包子铺一直生产包子
while (true) {
//必须使用同步技术包子两个线程只有一个在执行
synchronized (bz) {
if (bz.blag == true) {
try {
bz.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
//被唤醒之后执行,包子铺生产包子,
// 两种口味的包子,交替生产
if (count % 2 == 0) {
//生产薄皮豆沙馅
bz.pi = "薄皮";
bz.xian = "豆沙馅";
} else {
//生产厚皮三鲜馅
bz.pi = "厚皮";
bz.xian = "三鲜馅";
}
count++;
System.out.println("包子铺正在生产:" + bz.pi + bz.xian + "包子");
//生产包子需要时间
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
//包子铺生产好了包子 ,包子状态为true
bz.blag = true;
//唤醒吃货线程,让线程吃包子
bz.notify();
System.out.println("包子铺已经生产好了!吃货可以开吃了");
}
}
}
}
包子类
public class Baozi {
//皮
String pi;
//馅
String xian;
//包子的状态:有true没有false 设置初始值为false没有包子
boolean blag =false;
}
吃货类
public class ChiHuo extends Thread {
private Baozi bz;
public ChiHuo(Baozi bz){
this.bz=bz;
}
@Override
public void run() {
while (true){
synchronized(bz){
if (bz.blag==false){
try {
bz.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
//被唤醒
System.out.println("吃货正在吃:"+bz.pi+bz.xian+"包子");
//修改包子的状态为false
bz.blag=false;
//吃货唤醒包子铺线程,生产包子
bz.notify();
System.out.println("吃货已经吃完了");
System.out.println("----------------------");
}
}
}
}
测试类
public class DemoTest {
public static void main(String[] args) {
Baozi bz = new Baozi();
new baoZiPu(bz).start();
new ChiHuo(bz).start();
}
}
![]()