首页 > 其他分享 >25 生产者消费者问题:利用缓冲区:管程法

25 生产者消费者问题:利用缓冲区:管程法

时间:2023-09-08 16:57:07浏览次数:36  
标签:25 SynBuffer Producer 管程 缓冲区 new public synBuffer

package ThreadDemo;

// 生产者消费者问题:利用缓冲区:管程法
  // wait()令自己等待 ,notify()唤醒别的线程
public class Test25_Producer_Consumer_1 {
    public static void main(String[] args) {
        SynBuffer synBuffer = new SynBuffer();
        new Consumer(synBuffer).start();
        new Producer(synBuffer).start();


    }
}

//生产者
class Producer extends Thread{
    SynBuffer synBuffer= new SynBuffer();
    public Producer(SynBuffer synBuffer) {
        this.synBuffer = synBuffer;
    }

    @Override
    public void run() {
        for (int i = 1; i <=100; i++) {
            try {
                synBuffer.push();
                System.out.println("生产了第"+i+"件产品");
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }
        }
    }
}

//消费者
class Consumer extends Thread{
    SynBuffer synBuffer= new SynBuffer();
    public Consumer(SynBuffer synBuffer) {
        this.synBuffer = synBuffer;
    }

    @Override
    public void run() {
        for (int i = 1; i <=100; i++) {
            try {
                synBuffer.pop();
                System.out.println("消费了第"+i+"件产品");
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }
        }
    }
}

// 产品
class Product {
    int id;
    public Product(int id){
        this.id=id;
    }
}

// 安全的缓冲区
class SynBuffer{
    Product[] products=new Product[10];  //缓冲区大小
    static int  count=0;  // 产品计数,一开始为零,需要生产
    // 生产者
    public synchronized void push() throws InterruptedException {
        // 判定能否生产,满了的话,等待消费者消费
        if (count>=10){
            System.out.println("缓冲区满了,需要消费者及时消费");
            wait();
        }
        // 不满的话,继续生产
        count++;
        // 有储存就通知消费者消费
        this.notify();
    }

    // 消费者
    public synchronized void pop() throws InterruptedException {
        // 判定能否消费,没有储存就等待生产者生产
        if (count<=0){
            System.out.println("没有产品可以消费了,需要生产者生产");
            wait();
        }
        // 有的话就消费
        count--;
        // 消费之后,再次通知生产者生产
        this.notify();
    }
        // 这里应该是让chickens[count]=null吧
}

标签:25,SynBuffer,Producer,管程,缓冲区,new,public,synBuffer
From: https://www.cnblogs.com/zhanjianhai/p/17688029.html

相关文章

  • 4. Oracle数据库提示ERROR: ORA-12560: TNS: 协议适配器错误
    造成ORA-12560:TNS:协议适配器错误的问题的原因有三个:有关服务没有启动windows平台个一如下操作:开始—程序—管理工具—服务,打开服务面板,启动TNSlistener服务。注册表问题我这里错误的原因是之后又创建了一个数据库,似乎是将之前ORACLE_SID的值冲掉了,这里改回来即可解决......
  • 【230908-6】已知:a=2^4/3,b=4^2/5,c=25^1/3,则a,b,c的大小关系是?(23年全国III卷)
    ......
  • RationalDMIS2023量块程序2025
    DECL/LOCAL,REAL,LPEND,HEIGHT,TOLERROR,LL,CRDVCE,PROBVCEDECL/LOCAL,CHAR,20,BARAXIS,PROB,ANSDECL/COMMON,DOUBLE,DR_PRBRAD,PRO_APPRCH,PRO_RETRCT,MSVELDECL/COMMON,DOUBLE,VI,VJ,VK,VI2,VJ2,VK2,DCX,DCY,DCZ,DX,DY,DZ,BARDIR,DMAX,DMINDECL/C......
  • 牛客——SQL254 统计salary的累计和running_total
    描述按照salary的累计和running_total,其中running_total为前N个当前(to_date='9999-01-01')员工的salary累计和,其他以此类推。具体结果如下Demo展示。。CREATETABLEsalaries(emp_noint(11)NOTNULL,salaryint(11)NOTNULL,from_datedateNOTNULL,to_datedate......
  • 《Java编程思想第四版》学习笔记25
    若调用了break和continue语句,finally语句也会得以执行。请注意,与作上标签的break和continue一道,finally排除了Java对goto跳转语句的需求。                                       ......
  • 牛客——SQL253 获取有奖金的员工相关信息
    描述现有员工表employees如下:emp_nobirth_datefirst_namelast_namegenderhire_date100011953-09-02GeorgiFacelloM1986-06-26100021964-06-02BezalelSimmelF1985-11-21有员工奖金表emp_bonus:emp_noreceviedbtype100012010-01-011......
  • 协议SPI:四线同步全双工 W25Qxx
    SPI传输速度快80M,富家子弟最简单最快速完成SCK-时钟 MOSI主机输出(DO),从机输入MISO(DI)   SSSlaveSelect(CSChipSelect)从机选择线,低电平有效,从高电平到低电平就是协议起始信号,反之是结束信号只支持一主多从,  SPI通信基础:主从机的移位寄存器交换字节 (硬件电路的话......
  • 二叉树-257二叉树的所有路径带回溯思想
    257. 二叉树的所有路径1#Definitionforabinarytreenode.2#classTreeNode:3#def__init__(self,val=0,left=None,right=None):4#self.val=val5#self.left=left6#self.right=right7classSolution:8......
  • 泛微E-Office文件上传漏洞复现(CVE-2023-2523&CVE-2023-2648)
    漏洞概述cve-2023-2523泛微e-office9.5版本,源文件App/Ajax/ajax.php?action=mobile_upload_save的一些未知功能存在问题。参数upload_quwan的操作导致不受限制的上传,未经身份验证的恶意攻击者通过上传恶意文件,从而获取目标服务器的控制权限。cve-2023-2648由于泛微e-off......
  • 2023-08-26:请用go语言编写。开心一下的智力题: 有一个村庄,一共250人, 每一个村民要么一
    2023-08-26:请用go语言编写。开心一下的智力题:有一个村庄,一共250人,每一个村民要么一定说谎,要么只说真话,村里有A、B、C、D四个球队,且每个村民只会喜欢其中的一支球队,但是说谎者会不告知真实喜好,而且会说是另外三支球队的支持者。访问所有的村民之后,得到的访谈结果如下:A的支持者有90......