消费者
public class BaoZi {
//皮
String pi;
//陷
String xian;
//包子的状态:有true,没有false
boolean flag = false;
1.生产者(包子铺)类是一个线程类,可以继承Thread
设置线程任务(run):生产包子
对包子的状态进行判断
true:有包子
包子铺调用wait方法进入等待状态
false:没有包子
包子铺生产包子
增加一些趣味性;交替生产两种包子
有两种状态(i/2==0)
包子铺生产好了包子
修改包子的转台为true
唤醒吃货线程,让吃货线程吃包子
注意:
包子铺线程和包子线程关系 --->通信(互斥)
必须同时同步技术保证两个线程只能有一个在执行
锁对象必须保证唯一,可以使用包子对象作为锁对象
包子铺类和吃货类就需要把包子对象作为锁对象
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.flag == true){
//包子铺调用wait方法进入等待状态
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 + "包子");
//生产包子需要3秒钟
try{
Thread.sleep(300);
}catch (InterruptedException e){
e.printStackTrace();
}
//包子铺生产好了包子
//修改包子的状态为true有
bz.flag = true;
//唤醒吃货线程,让吃货线程吃包子
bz.notify();
System.out.println("包子铺已经生产好了:" + bz.pi + "包子可以开始吃了");
}
}
}
}