Day42 生产者消费者

news/2024/11/29 12:52:34/

生产者消费者

  1. Object类中的等待和唤醒方法

    方法名说明
    void wait ()导致当前线程等待,直到另一个线程调用该对象的notify()方法或notifyAll()方法
    void notify ()唤醒正在等待对象监视器的单个线程
    void notifyAll ()唤醒正在等待对象监视器的所有线程

  2. 案例:生产者和消费者送牛奶和消费牛奶(奶箱:Box 生产者:Producer 消费者:Customer 测试类:BoxDemo)

//定义一个奶箱类
public class Box{//定义一个成员变量表示第X瓶奶private int milk;//定义一个成员变量,表示奶箱的状态(默认为空)private boolean state = false;//提供存储牛奶和获取牛奶的操作public synchronized void put(int milk){//如果有牛奶,等待消费if(state){try{wait();}catch (InterruptedException e){e.printStackTrace();}}//如果没有牛奶,就生产牛奶this.milk = milk;System.out.println("送奶工将第"+this.milk+"瓶奶放入奶箱");//生产完毕后,修改奶箱状态state = true;//唤醒其他等待线程notifyAll();}public synchronized void get(){//如果没有牛奶,等待生产if(!state){try{wait();}catch (InterruptedException e){e.printStackTrace();}}//如果有牛奶就消费牛奶System.out.println("用户拿到第"+this.milk+"瓶奶");//消费完毕后,修改奶箱状态state = false;//唤醒其他等待线程notifyAll();}
}
//定义一个生产者类
public class Producer implements Runnable{private Box b;public Producer(Box b){  //生成带参构造方法this.b = b;}@Overridepublic void run(){   //重写run()方法for(int i = 0; i<5; i++){b.put(i);//生产者生产5瓶牛奶}}
}
//定义一个消费者类
public class Customer implements Runnable{private Box b;public Customer(Box b){this.b = b;}@Overridepublic void run(){while (true){  //消费者使用死循环来获取奶箱中的奶b.get();}}
}
//测试类
public class BoxDemo{public static void main(String[] args){//创建奶箱对象,为共享数据区域Box b = new Box();//创建生产者对象,把奶箱对象作为构造方法参数传递,因为在这个类中要调用存储牛奶操作Producer p = new Producer(b);//创建消费者对象,把奶箱对象作为构造方法参数传递,因为在这个类中要调用存储牛奶操作Customer c = new Customer(b);//创建2个线程对象,分别把生产者对象和消费者对象作为构造方法参数传递Thread t1 = new Thread(p);Thread t2 = new Thread(c);//启动线程t1.start();t2.start();}
}

http://www.ppmy.cn/news/64842.html

相关文章

上林赋 汉 司马相如

亡是公听然而笑曰&#xff1a;“楚则失矣&#xff0c;而齐亦未为得也。夫使诸侯纳贡者&#xff0c;非为财币&#xff0c;所以述职也。封疆画界者&#xff0c;非为守御&#xff0c;所以禁淫也。今齐列为东藩&#xff0c;而外私肃慎&#xff0c;捐国逾限&#xff0c;越海而田&…

GUN C编译器拓展语法学习笔记(二)属性声明

属性声明 一、属性声明1、存储段&#xff1a;section1.1 GNU C编译器扩展关键字&#xff1a;__attribute__1.2 属性声明&#xff1a;section1.3 U-boot镜像自复制分析 2、属性声明&#xff1a;aligned2.1 地址对齐&#xff1a;aligned2.2 结构体对齐&#xff1a;aligned2.3 属性…

【话题讨论】-浅谈VR与AR

一、引言 随着ICT基础技术的发展&#xff0c;我们现在社会中的基础ict设施已经逐步完善&#xff0c;从而我们的社会也开始出现科幻片中才会有的场景&#xff0c;比如&#xff1a;我们可以构件一个虚拟3D沙盘。 还有我们熟悉的各类智能眼镜&#xff0c;已经进入到千家万户&…

3.是人就能学会的Spring源码教学-IOC容器的核心实现原理

是人就能学会的Spring源码教学-IOC容器的核心实现原理 我们学习Spring源码的动力&#xff0c;估计大部分人都是因为面试中会问到吧。 那么我们今天就以面试问Spring来开头。 关于Spring&#xff0c;在面试的时候一般会问到的两个最基础的问题。 第一个什么是IOC&#xff1f…

系统分析师---论软件多层架构的设计(付费资料)

论软件多层架构的设计 目前,三层架构或多层架构已经成为软件开发的主流,采用多层架构有很多好处,例如,能有效降低建设和维护成本,简化管理,适应大规模和复杂的应用需求,可适应不断的变化和新的业务需求等。在多层架构的开发中,中间件的设计占重要地位。 请围绕“软件…

正态分布线性计算的方差推导(含协方差推导)

推导如下&#xff1a; 由于方差是每个数据与均值离差平方和的均值&#xff1a;即对Σ&#xff08;每个数据-均值&#xff09;再求一次均值&#x1f447;&#xfeff;&#xfeff; 最终Var(X) E(X&#xff09;-E&#xff08;X) 因此&#x1f447; Var(X-Y) E(X-Y)-E(X-Y) …

Unity 过场工具(Cutscene)设计(三)

Unity 过场工具(Cutscene)设计&#xff08;三&#xff09; 由于过年来公司的一些事情后准备换工作&#xff0c;到现在才换到下家稳定下来。 到动手这篇博客时已经隔了很久好几个月了&#xff0c;后续还是会持续的更新完 工具的使用者 在设计工具之前需要考虑到工具的实际使用者…

防火墙的介绍与规范

防火墙规范 一、前言 防火墙是企业信息安全的重要组成部分&#xff0c;它能够控制网络流量&#xff0c;防止未经授权的访问&#xff0c;保护企业网络的安全。本规范旨在规范企业防火墙的配置、管理和维护&#xff0c;确保防火墙的有效运行和保护企业信息安全。 二、防火墙基…