当前位置: java基础教程 > 11-java多线程 > 阅读正文

线程的 pv 操作

2021.2.14.   547 次   1453字

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();
    }
}

运行结果:

包子铺开始做包子
包子造好了:冰皮五仁
吃货来吃吧
吃货正在吃冰皮五仁包子
包子铺开始做包子
包子造好了:薄皮牛肉大葱
吃货来吃吧
吃货正在吃薄皮牛肉大葱包子
包子铺开始做包子
包子造好了:冰皮五仁
......

本篇完,还有疑问?

加入QQ交流群:11500065636 IT 技术交流群