如何按下消费者大脑中的"购买按钮"《销售脑》
《销售脑》是一本教授如何更好的销售的沟通技巧书籍。...
2023-07-31
在本篇文章中,我将为你介绍并发中的经典问题-生产者与消费者问题,并基于前面系列文章的知识点,通过wait、notify实现这一问题的简版方案。
生产者消费者问题(Producer-consumer problem),也称有限缓冲问题(Bounded-buffer problem),是一个多进程、线程同步问题的经典案例。
这个问题描述了共享固定大小缓冲区的两个进程——即所谓的“生产者”和“消费者”——在实际运行时会发生的问题。生产者的主要作用是生成一定量的数据放到缓冲区中,然后重复此过程。与此同时,消费者也在缓冲区消耗这些数据。
生产者与消费者问题的关键在于要保证生产者不会在缓冲区满时加入数据,消费者也不会在缓冲区中空时消耗数据。

要解决该问题,就必须让生产者在缓冲区满时休眠(要么干脆就放弃数据),等到下次消费者消耗缓冲区中的数据的时候,生产者才能被唤醒,开始往缓冲区添加数据。
同样,也可以让消费者在缓冲区空时进入休眠,等到生产者往缓冲区添加数据之后,再唤醒消费者。通常采用线程间通信的方法解决该问题,常用的方法有信号量等。如果解决方法不够完善,则容易出现死锁的情况。出现死锁时,两个线程都会陷入休眠,等待对方唤醒自己。
当然,生产者与消费者问题并不是局限于单个生产者与消费者,在实际工作中,遇到更多的是多个生产者和消费者的情形。

生产者与消费者模式在软件开发与设计中有着非常广泛的应用。在这一模式中,生产者与消费者相互独立,它们仅通过缓冲区传递数据,因此可以用于程序间的解耦、异步削峰等。
生产者与消费者问题的要点:
本节中,我们通过王者中的一个场景来模拟生产者与消费者问题。
在王者中,英雄兰陵王需要通过打野来发育,但是野区的野怪在被打完之后,需要隔一段时间再投放。
所以,我们创建两个线程,一个作为生产者向野区投放野怪,一个作为消费者打怪。

生产者:每秒检查一次野区,如果野区没有野怪,则进行投放。野怪投放后,通知打野英雄。
// 野怪投放【生产者】public static class WildMonsterProducer implements Runnable { public void run() { try { createWildMonster(); } catch (InterruptedException e) { System.out.println("野怪投放被中断"); } } //投放野怪,每1秒检查一次 public void createWildMonster() throws InterruptedException { for (int i = 0;; i++) { synchronized(wildMonsterArea) { if (wildMonsterArea.size() == 0) { wildMonsterArea.add("野怪" + i); System.out.println(wildMonsterArea.getLast()); wildMonsterArea.notify(); } } Thread.sleep(1000); } }}消费者:打野英雄兰陵王作为消费者,在野区打怪发育。如果野区有野怪,则打掉野怪。 如果没有,会进行等待野区新的野怪产生。
// 兰陵王,打野英雄public static class LanLingWang implements Runnable { public void run() { try { attackWildMonster(); } catch (InterruptedException e) { System.out.println("兰陵王打野被中断"); } } // 打野,如果没有则进行等待 public void attackWildMonster() throws InterruptedException { while (true) { synchronized(wildMonsterArea) { if (wildMonsterArea.size() == 0) { wildMonsterArea.wait(); } String wildMonster = wildMonsterArea.getLast(); wildMonsterArea.remove(wildMonster); System.out.println("收获野怪:" + wildMonster); } } }}创建野区,并启动生产者与消费者线程。
public class ProducerConsumerProblemDemo { // 野怪活动的野区 private static final LinkedList<String> wildMonsterArea = new LinkedList<String>(); public static void main(String[] args) { Thread wildMonsterProducerThread = new Thread(new WildMonsterProducer()); Thread lanLingWangThread = new Thread(new LanLingWang()); wildMonsterProducerThread.start(); lanLingWangThread.start(); }}在上面几段代码中,你需要重点注意的是synchronized、wait和notify用法,它们是本次方案的关键。运行结果如下:
野怪0收获野怪:野怪0野怪1收获野怪:野怪1野怪2收获野怪:野怪2野怪3收获野怪:野怪3野怪4收获野怪:野怪4野怪5收获野怪:野怪5野怪6收获野怪:野怪6从结果可以看到,生产者在创建野怪后,打野英雄兰陵王会进行打野,实现了生产者与消费者的问题。
以上就是关于线程异常处理的全部内容,在本文中我们基于wait、notify来解决生产者与消费者问题。对于本文内容,你需要理解生产者与消费者问题的核心是什么。另外,本文所提供的方案仅仅是这一问题多种解决方案中的一种,在后面的文章中,我们会根据新的知识点提供其他的解法。
以上内容就是为大家推荐的java生产者消费者代码(java实现生产者消费者问题)最佳回答,如果还想搜索其他问题,请收藏本网站或点击搜索更多问题
内容来源于网络仅供参考版权声明:所有来源标注为小樱知识网www.xiaoyin02.com的内容版权均为本站所有,若您需要引用、转载,只需要注明来源及原文链接即可。
本文标题:java生产者消费者代码(java实现生产者消费者问题)
本文地址:https://www.xiaoyin02.com/shcs/119227.html
相关文章
手机怎么安装qq,支持java的手机怎么安装qq? 用手机的浏览器打开3g.qq.com然后选择QQ找到下载选择品牌机型如果没有的话可以下载通用版根据屏幕尺寸下载...
2023-04-20
京东手机怎么投诉,消费者买来手机第八天降价四五百块钱怎么维权? 依据我国相关法律的规定,手机买了就降价产生的纠纷属于消费纠纷,消费者可以与...
2023-04-19
手机淘宝保证金怎么解冻,淘宝的消费者保障金怎样解冻? 淘宝消费者保障金解冻的方法如下 在淘宝商家后台页面,单击消费者保证金。 在保证金页面,...
2023-04-01
北京商报讯(记者 卢扬 韩昕媛)据中国消费者协会官方网站,2 月 15 日,《2022 年全国消协组织受理投诉情况分析》发布,根据 2022 年服务大类投诉数据,...
2023-02-16
热点文章
2021年独生子女补贴新政策是真的吗(独生子女证有有效期吗)
2021年国庆节阅兵仪式几点开始几点结束(2021年国庆节还有阅兵吗)
鼠目寸光一点红是什么生肖动物(鼠目寸光一点红)指什么生肖,紧密
k0到k9的玩法大全(强制gc的玩法和注意事项)
入土为安是什么生肖《入土为安》打一个生肖动物,词语解释
浙江12月底全面停工是真的吗(浙江什么时候放假停工)
如何做t(t怎么把p做哭)
北京口碑最差的三甲医院(北京301医院最擅长什么)