当前位置: 首页 > news >正文

福州专业网站建设价格/无锡百度快速优化排名

福州专业网站建设价格,无锡百度快速优化排名,小学教育网站专题模板,邯郸购物网站建设概述: (java的线程调度模式采用的是抢占式调度) 生产者消费者是一个十分经典的多线程协作模式,弄懂生产者消费者问题能够让我们对多线程编程的理解更加深刻。 所谓生产者问题,实际上主要是包含了两类线程&#xff1a…

概述:

(java的线程调度模式采用的是抢占式调度

生产者消费者是一个十分经典的多线程协作模式,弄懂生产者消费者问题能够让我们对多线程编程的理解更加深刻。

所谓生产者问题,实际上主要是包含了两类线程:

  • 一类是生产者线程用于生产数据;
  • 一类是消费者用于消费数据;
  • 为了解耦生产者和消费者的关系,通常会采用共享的**数据区域**,就像是一个仓库,生产者生产数据之后直接放置在共享区域中,并不需要关心消费者的行为。
  • 消费者只需要从共享区域中获取数据,并不需要关心生产者的行为。

在这里插入图片描述

为了体现生产和消费过程中的等待和唤醒,java中提供了几个方法供我们使用,这几个方法在Object类中,分别是wait()、notify()、notifyAll()三个方法。

三个核心点:

  • 任何对象中都一定有着三个方法(因为任意类都继承自Object类)
  • 只有作为锁对象的时候,才可以调用
  • 只有在同步的代码块中,才可以调用

其他情况下,调用一个对象的这三个方法,都会报错

  • void wait() :导致当前线程进入无限期等待状态,直到另一个线程调用该对象的notify()方法或notifyAll()方法。
  • void notify() : 随机唤醒一个正在等待对象监视器的线程。
  • void notifyAll() :唤醒正在等待对象监视器的所有线程。

需求:

奶箱类(Box),定义一个成员变量,表示第x瓶奶,提供存储牛奶和获取牛奶的操作。

生产者类(product),实现Runnable接口,重写run()方法,调用存储牛奶的操作。

消费者类(Customer),实现Runnable接口,重写run()方法,调用获取牛奶的操作。

测试类(Test),里面有main方法,main方法中的调用步骤如下:

  1. 创建奶箱对象,这是共享数据区域
  2. 创建生产者对象,把奶箱对象通过构造方法进行参数传递,因为在这个类中,要调用存储牛奶的操作。
  3. 创建消费者对象,把奶箱对象通过构造方法进行参数传递,因为在这个类中,要调用获取牛奶的操作
  4. 创建两个线程对象,分别把生产者和消费者对象作为构造方法参数传递。
  5. 启动线程

1、创建奶箱对象,这是共享数据区域

奶箱类中定义了一个奶箱数量milk和奶箱状态state,以及存储牛奶和获取牛奶的操作。

package CoreJava.day15_thread.product;/*** Created by Intellij IDEA.** @author zhudezhong* @date 2021/6/27 20:52*/
//奶箱
public class Box {//定义牛奶的数量private int milk;//定义一个奶箱状态private boolean state = false;  //true表示奶箱有奶,false表示奶箱无奶//存取牛奶public synchronized void put(int milk) {if (state) {//奶箱有奶,则让停止往奶箱中放奶,等待消费者消费try {wait();} catch (InterruptedException e) {e.printStackTrace();}}//奶箱中没有奶,往其中放牛奶this.milk = milk;System.out.println("生产者生产了第" + milk + "瓶牛奶");//放完奶之后让奶箱的状态变为truestate = true;//唤醒消费者,来拿牛奶notifyAll();}//拿到牛奶public synchronized void get() {//奶箱中没有牛奶,等待生产者生产牛奶if (!state){try {wait();} catch (InterruptedException e) {e.printStackTrace();}}//有牛奶,获取牛奶System.out.println("送奶工拿到了第" + milk + "瓶牛奶");//获取玩牛奶后改变奶箱状态state = false;//唤醒生产者来生产notifyAll();}}

2、创建生产者对象,把奶箱对象通过构造方法进行参数传递,因为在这个类中,要调用存储牛奶的操作。

生产者类中,定义了一个有参构造方法,该参数是奶箱(Box)对象。这个参数传递的方式保证了我们传入的奶箱是同一个奶箱,创造一个了数据共享区域

package CoreJava.day15_thread.product;/*** Created by Intellij IDEA.** @author zhudezhong* @date 2021/6/27 20:52*/
//生产者
public class Product implements Runnable {private Box box;//该构造方法可以确保传入的box奶箱是同一个对象public Product(Box box) {this.box = box;}@Overridepublic void run() {//放入牛奶for (int i = 1; i <= 5; i++) {box.put(i);}}
}

3、创建消费者对象,把奶箱对象通过构造方法进行参数传递,因为在这个类中,要调用获取牛奶的操作

package CoreJava.day15_thread.product;/*** Created by Intellij IDEA.** @author zhudezhong* @date 2021/6/27 20:52*/
//消费者
public class Custermor implements Runnable{private Box box;public Custermor(Box box) {this.box = box;}@Overridepublic void run() {//一直取牛奶while (true){box.get();}}
}

4、测试类(Test)

package CoreJava.day15_thread.product;/*** Created by Intellij IDEA.** @author zhudezhong* @date 2021/6/27 20:53*/
public class Test {public static void main(String[] args) {//创建奶箱对象Box box = new Box();//创建生产者、消费者任务对象Product product = new Product(box);Custermor custermor = new Custermor(box);//创建并启动生产者消费者线程Thread t1 = new Thread(product);Thread t2 = new Thread(custermor);t1.start();t2.start();}
}

运行结果:

在这里插入图片描述

http://www.jmfq.cn/news/5081869.html

相关文章:

  • 网站系统架构图/百度推广登录页面
  • 网站开发和网站建设/电脑优化大师下载安装
  • 电脑网站制作教程/宁波正规seo推广
  • 宁波网站建设哪家好/搜索引擎优化方法总结
  • 企业门户网站在信息系统架构中属于哪个层次/2023网络营销成功案例
  • 网站建设 开发/推广引流吸引人的标题
  • php 获取网站根域名/软文宣传
  • 类似一起做网店的网站/外贸网站制作公司
  • 淘宝天猫做网站咨询/b站推广app大全
  • 中国建设银行公积金网缴网站/免费的短视频app大全
  • 网站首页图片轮播/互联网创业项目
  • wordpress门户网站主题/东莞seo建站排名
  • 网络管理系统有哪几部分组成/衡阳seo优化首选
  • 建网页用什么软件/杭州seo百度关键词排名推广
  • 做甜品网站栏目/上海sem
  • 有视频做的很好的网站吗/站长网站查询
  • 服务器网站建设教程/搜索引擎优化seo是什么
  • 网站建设通/真正免费建站网站
  • 广东网站建设多少钱/网站优化技巧
  • bex5可以做网站吗/搜索引擎快速排名推广
  • 做网站怎么样才能排在首页/近日网站收录查询
  • 如何做擦边球网站/关键词优化计划
  • 大连网站建设企业/网站关键词排名批量查询
  • 漳州本地网/湖南网站营销seo多少费用
  • 政府网站集约化建设 总结/谷歌seo网站推广
  • 张家口做网站哪家好/seo发帖网站
  • 如何更改网站源码/软文推广是什么意思
  • 海南网站建设/西安seo顾问
  • 网站开发成功案例/中国网络营销公司
  • 做一个网站需要多长时间/微营销系统