PV 操作,是操作系统对 等待唤醒 线程的说法
PV 操作,表示 2 个互斥线程同时只有 1 个在运行
1.生产者消费者 PV 操作分析
只有 1 个生产者 和 1 个消费者,其中一个睡眠另一个工作
建立一个包子类,3 个属性,皮,陷,包子是否存在的状态
建立一个包子铺,包子存在则睡眠,包子不存在则生成包子,生产完毕唤醒吃货
建立一个吃货线程,包子不存在则睡眠,包子存在则吃掉,然后唤醒包子铺
建立一个Demo类,写main函数,实例化包子,包子铺,吃货,启动这 2 个线程
2.代码实现
建立一个 Demo.java 文件,拷贝如下代码
class BaoZi {//包子
String pier ;
String xianer ;
boolean flag = false ;//包子资源 是否存在 包子资源状态
}
class BaoZiPu extends Thread {//包子铺
private BaoZi bz;
public BaoZiPu(String name,BaoZi bz){
super(name);
this.bz = bz;
}
@Override
public void run() {
int count = 0;//造包子
while(true){//同步
synchronized (bz){
if(bz.flag == true){//包子资源 存在
try {
bz.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
// 没有包子 造包子
System.out.println("包子铺开始做包子");
if(count%2 == 0){// 冰皮 五仁
bz.pier = "冰皮";
bz.xianer = "五仁";
}else{// 薄皮 牛肉大葱
bz.pier = "薄皮";
bz.xianer = "牛肉大葱";
}
count++;
bz.flag=true;
System.out.println("包子造好了:"+bz.pier+bz.xianer);
System.out.println("吃货来吃吧");
//唤醒等待线程 (吃货)
bz.notify();
}
}
}
}
class ChiHuo extends Thread{//吃货
private BaoZi bz;
public ChiHuo(String name,BaoZi bz){
super(name);
this.bz = bz;
}
@Override
public void run() {
while(true){
synchronized (bz){
if(bz.flag == false){//没包子
try {
bz.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println("吃货正在吃"+bz.pier+bz.xianer+"包子");
bz.flag = false;
bz.notify();
}
}
}
}
public class Demo {//main 所在的 public class
public static void main(String[] args) {
//pv操作案例
BaoZi bz = new BaoZi();
ChiHuo ch = new ChiHuo("吃货",bz);
BaoZiPu bzp = new BaoZiPu("包子铺",bz);
ch.start();
bzp.start();
}
}
运行结果:
包子铺开始做包子
包子造好了:冰皮五仁
吃货来吃吧
吃货正在吃冰皮五仁包子
包子铺开始做包子
包子造好了:薄皮牛肉大葱
吃货来吃吧
吃货正在吃薄皮牛肉大葱包子
包子铺开始做包子
包子造好了:冰皮五仁
......