java 生产者消费者_Java 多线程实现生产者和消费者模式

374ad0452277b1c9017ec819ee52a9e5.png

一、生产者和消费者模式描述

生产者和消费者问题是线程模型中的经典问题:生产者和消费者在同一时间段内共用同一存储空间,生产者向空间里生产数据,而消费者从空间里取走数据。

存在的问题:
  • 当生产者比消费者快时,消费者会漏掉一部分数据;
  • 当消费者比生产者快时,消费者会取走相同的数据。
解决方案(考虑到线程安全问题,解决此问题有三种方式):
  1. 同步代码块
  2. 同步方法
  3. lock 锁机制, 通过创建 Lock 对象,采用 lock() 加锁,unlock() 解锁,来保护指定的代码块
注:本文章我们采用第二种方式解决了线程安全问题

二、wait() 和 notify() 方法

  • wait():当缓冲区已满 / 空时,生产者或消费者线程停止自己的执行,释放锁,使自己处于等待状态,让其它线程执行。

3dd2d6c42430aa90d2f7c24714b74e6c.png
  • notify():当生产者或消费者向缓冲区放入或取出一个产品时,向其他等待的线程发出通知,同时释放锁,使自己处于等待状态,让其它线程执行。

34a2bbbda30c8a3aa248d261ad6acb8c.png
wait()、nofity() 这两个方法必须有锁对象调用,而任意对象都可以作为 synchronized 的同步锁,因此这两个方法只能在 Object 类中声明 。

三、生产者和消费者模式代码实现

商店类(Shop):定义一个成员变量,表示第几个面包,提供生产面包和消费面包的操作;
public 
生产者类(Producer):实现 Runnable 接口,重写 run() 方法,调用生产面包的操作;
public 
消费者类(Consumer):实现 Runnable 接口,重写 run() 方法,调用消费面包的操作;
public 
测试类:测试消费者和生产者模式
public 
运行结果:

ff1a9eb01386fd45d83f1d5bd7fcf06f.gif
知乎视频​www.zhihu.com

希望能够帮到大家,有问题的可以留言讨论哦!

768a9ebb04a24abcb7d34733521681f6.gif
3.生产者消费者模式-多线程实现 文章目录博客概述代码实现主函数生产者消费者任务对象 博客概述 生产者消费者模式是MQ的设计思想。这个模式也是一个非常经典的多线程设计模式,我们在实际开发中应用非常广泛的思想理念。在生产消费模式中,通常有两类线程,即若干个生产者线程,若干个消费者线程,生产者负责提交用户需求,消费者负责处理用户需求,在生产者消费者之间通过内存缓冲区进行通信。 用的最多就是消息中间件Mq。mq:消息队列。是一个数据缓存... 阅读详情

相关推荐

Java并发编程系列21:多线程之生产者和消费者模式(使用BlockingQueue实现)

Java多线程之生产者和消费者模式(使用BlockingQueue实现)

fen_fen的专栏 1165

生产者和消费者问题--线程模型中的经典问题

转载:https://www.cnblogs.com/happyPawpaw/archive/2013/01/18/2865957.html 引言   生产者和消费者问题是线程模型中的经典问题:生产者和消费者在同一时间段内共用同一个存储空间,如下图所示,生产者向空间里存放数据,而消费者取用数据,如果不加以协调可能会出现以下情况: 生产者消费者图   存储空间已满,而生产者占用着它,消费者等...

fct2001140269的博客 633

倒立摆入门详解+pid调参

倒立摆制作全过程 最近在练习pid的控制算法,就选用了2013年的电子设计国赛题目:倒立摆 。 首先给你们看看我的成果 注意哦:倒立摆不是靠上面黄色的传感器保持平衡的,而是通过下面的电机左右扭动使得摆杆不掉下来,难度可不小了。 材料准备 1.机械部分 如图所示选好电机和角位移传感器进行组装就好了,这个部分是我直接网上购买的,如果要自己装也是可以的,不过会比较麻烦,结构差不多的。 2.主控部分 这个部分的话完全是我自己设计的,作用和网上买的一样,因为网上买的话太贵了,有需要的话可以联系我,有pcb文件

small_po_kid的博客 2万+

java多线程,模拟面包店制作面包(消费者,生产者)--两种不同的方式实现

假设柜台最多放10个面包,顾客买面包,没有面包--等待,师傅制作面包-唤醒。

weixin_62971115的博客 391

【ANSYS Workbench仿真】命令流:压力渗透pressure penetration

对与流体接触的part添加边界压力,使流体压力渗透点的接触应力与流体压力相等,以便得到真实的变形结果,就需要用到“pressure penetration”。 但是在ansys中,只能通过ADPL的形式添加,即在workbench中添加命令流的形式。此文主要介绍了**压力渗透的添加要点**和**命令流使用说明**。

路边小M's Blog 1万+

海康威视iVMS-4200在银河麒麟系统部署全攻略与疑难排解

在信创国产化进程中,软件兼容性是关键挑战之一。以安防监控领域广泛使用的海康威视iVMS-4200客户端为例,其从Windows环境迁移到银河麒麟等国产操作系统时,面临架构适配、依赖库匹配等核心兼容性问题。这涉及到跨平台软件部署的通用原理:不同CPU架构(如ARM的飞腾、x86的兆芯)和操作系统底层API的差异,要求软件必须进行针对性编译和优化。解决这类问题的技术价值在于保障专业软件在国产化环境中的稳定运行,是信创产业落地的重要环节。具体到应用场景,如在基于银河麒麟V10的安防监控项目中,通过获取对应架构的.

weixin_33423874的博客 1425

Java多线程~线程间的通信、线程的等待与唤醒、线程通信的模拟使用(面包店买卖面包案例)

目录 线程间的通信 线程通信的概念 线程通信的使用方式 wait()-让线程进行等待 notify()-唤醒等待的线程 notifyAll()-唤醒等待中的线程 线程通信的应用案例 完整代码 运行结果 线程间的通信 多线程的优势是提高cpu的利用率,但使用时需要注意:当执行时间比较长的任务时,可能存在线程安全的问题,在以上的前提下,需要保证线程的执行有一定的顺序性,因此就有了线程通信的概念. 线程通信的概念 线程通信,就是一个以线程通知的方式,唤醒某些等待的线程(也可以在...

qq_58284486的博客 476

1014. 福尔摩斯的约会 (20)-PAT乙级真题

1014. 福尔摩斯的约会 (20) 大侦探福尔摩斯接到一张奇怪的字条:“我们约会吧!3485djDkxh4hhGE 2984akDfkkkkggEdsb s&hgsfdk d&Hyscvnm”。大侦探很快就明白了,字条上奇怪的乱码实际上就是约会的时间“星期四 14:04”,因为前面两字符串中第1对相同的大写英文字母(大小写有区分)是第4个字母’D’,代表星期四;第2对相同的字符是’

柳婼 の blog 2644

多线程设计模式:生产者-消费者

生产者,消费者:就好比厨师和食客,我们来看代码理解一下 https://www.cnblogs.com/xiaoxi/p/7910868.html https://www.jianshu.com/p/71a5089afe13

念念不忘,必有回响 3605

为什么我的Win11家庭版找不到BitLocker?教你两种强制关闭加密的隐藏方法

本文解释了Win11家庭版为何缺少BitLocker功能,并提供了两种强制关闭加密的隐藏方法。通过注册表修改和PowerShell命令,用户可以调出隐藏的加密控制面板或直接操控加密引擎,解决家庭版设备加密的管理难题。

weixin_42535703的博客 1764

抖音小程序开发 唤起收银台支付(可以选择支付宝APP支付或微信H5支付)

什么都别说,先看效果: 字节跳动也开放了小程序给商家接入,可以在旗下APP如抖音、今日头条、今日头条极速版等应用中即点即用,基于庞大的数亿用户量为其引流,帮助商家获取用户流量,销售商品,其模式和微信小程序差不多。 1、后台管理地址: https://developer.toutiao.com/ 2、开发文档地址: https://developer.toutiao.com/dev/cn/min...

悟空码字的博客 1万+

Java多线程并发采用BlockingQueue阻塞队列实现生产者和消费者模式

1、BlockingQueue简介 BlockingQueue 通常用于一个线程生产对象,而另外一个线程消费这些对象的场景。 一个线程往里边放,另外一个线程从里边取的一个 BlockingQueue。 一个线程将会持续生产新对象并将其插入到队列之中,直到队列达到它所能容纳的临界点。也就是说,它是有限的。如果该阻塞队列到达了其临界点,负责生产的线程将会在往里边插入新对象时发生阻塞。它会一直处于阻塞...

小白轩的博客 1227

2024 年 9 月青少年软编等考 C 语言三级真题解析

2024 年 9 月青少年软编等考 C 语言三级真题解析。

发布少儿编程考级的真题和优秀竞赛题解析,以及一些讲义。 1739

多线程-Java的经典实现-生产者和消费者模式

生产者和消费者模式是一种经典的并发编程模式,用于解决生产者和消费者之间的生产和消费问题。在该模式中,生产者负责生产数据并将数据放入共享的缓冲区(或队列)中,而消费者则负责从缓冲区中取出数据并进行消费。生产者和消费者之间通过共享的缓冲区进行通信,但彼此之间并不直接进行通信。

rainyonelove的专栏 1095

STM实战开发(13):STM32开发:使用光敏电阻检测光照强度

光敏电阻(LDR)是一种电阻值受光照强度影响的半导体材料。当光照强度增大时,光敏电阻的电阻值降低;而当光照强度减小时,电阻值则增大。光敏电阻的电阻变化与入射光的强度之间并不是线性关系,而是呈对数型的变化。LDR通常由硫化镉(CdS)或其他半导体材料构成,材料对不同波长的光有不同的响应特性。一般而言,光照强度越强,光敏电阻的电阻值越低,反之则越高。本文介绍了如何使用STM32与光敏电阻(LDR)结合,进行光照强度检测的实现方法。通过配置STM32的ADC模块,读取光敏电阻的电压信号,并根据电压计算光照强度。

2201_76125393的博客 3017

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

使用JAVA多线程简单实现生产者消费者模式,生产一个消费一个,利用wait方法和notify方法解决线程安全问题

一个线程负责生产,一个线程负责消费,生产满了就不能生产,必须消费,消费完了就必须让生产者生产。 因为是多线程问题,仓库是多线程共享,要注意线程同步,采用wait方法和notify方法 代码如下: /* wait方法和notify方法都是普通Java对象的方法 wait方法作用:让正在对象上的线程进入等待状态,并且释放掉线程占用的锁 notify方法的作用:让正在等待此对象的进程唤醒,但不会释放掉占用的锁 模拟环境: 仓库采用list集合模拟,为了方便假设只存储一个元素。 即list集合中有一个元素代表仓库满

peanut_trees的博客 1032

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

java 用多线程实现多生产者和多消费者模式

首先写一个同步类(这是最重要的):public class Pool { int water = 0; public synchronized void input() { if (water > 3) { System.out.println("水池满了"); try { this.wait(); } catch (Interru

vikecjy的专栏 2531

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

delphi生产者消费者模式代码_Java 多线程实现生产者和消费者模式

一、生产者和消费者模式描述 生产者和消费者问题是线程模型中的经典问题:生产者和消费者在同一时间段内共用同一存储空间,生产者向空间里生产数据,而消费者从空间里取走数据。存在的问题:当生产者比消费者快时,消费者会漏掉一部分数据;当消费者比生产者快时,消费者会取走相同的数据。解决方案(考虑到线程安全问题,解决此问题有三种方式):同步代码块 同步方法 lock 锁机制, 通过创建 Lock ...

weixin_31464715的博客 99

java多线程面试之手写阻塞队列,实现生产者和消费者模式。

什么是阻塞队列 首先,阻塞队列是一个队列,满足队列的基本数据结构,先进先出。其次,当队列满时,队列会阻塞插入元素的线程,直到队列不满;当队列空时,获取元素的线程会等待队列变为非空。 阻塞队列常用于生产者和消费者的场景,生产者是向队列里添加元素的线程,消费者是从队列里取元素的线程。 如何写一个阻塞队列 手写阻塞队列是多线程面试中常见的问题,能考察面试者对多线程和锁的基础知识。 通过synchronized关键字配合wait()和notify()方法,实现线程的交替运行: import java.util.Li

MaYuKang的博客 1738

Java多线程与并发_Synchronized和Lock实现生产者消费者模式

Java多线程与并发_Synchronized和Lock实现生产者消费者 能自己扛,就别声张​ 一、生产者消费者例子 现在两个线程 可以操作初始值为零的一个变量, 实现一个线程对该变量加1,一个线程对该变量减1 交替,来10轮,变量初始值为零 二、Synchronized实现 /** * @Author: slx * @Date: 2019/4/24 19:09 */ public clas...

shugeshow's Blog 437

Java多线程并发之生产者和消费者模式使用wait()和notify()通信方法实现

1、简介: 生产者和消费者模式生活当中随处可见,它描述的是协调与协作的关系。比如餐厅厨师在准备食物,那么厨师就是生产者,而来店里吃饭的客户则是消费者,消费者需要座子和椅子这就是公共的一个空间,在代码里座子和椅子则就是一个共享的对象。 2、需求 生产者:指的是生产好某样东西放在一个公共的空间里,这里指的是放到餐盒里 消费者:指的是从公共的空间里取出生产好的东西,这里指的是从餐盒里取餐 餐盒:这里我对...

小白轩的博客 641

java多线程 消费者生产者_【多线程】java多线程实现生产者消费者模式 synchronized+Object的wait/notify方式 和 Lock+Condition的await/s...

=========================使用synchronized,配合Object的wait()/notify()实现生产者消费者======================思考问题:1.为什么用wait()+notify()实现生产者消费者模式?wait()方法可以暂停线程,并释放对象锁notify()方法可以唤醒需要该对象锁的其他线程,并在执行完后续步骤,到了synchroniz...

weixin_28676397的博客 283

Java多线程问题--ReentrantLock和Condition实现多生产者/多消费者模式以及唤醒特定线程

本文内容部分引自《Java多线程编程核心技术》,感谢作者!!! 代码地址:https://github.com/xianzhixianzhixian/thread.git ReentrantLock和Condition基本用法 1、ReentrantLock类中的lock()和unlock()方法要成对使用,lock()方法使当前线程获得对象锁,unlock()方法使当前线程释放对象锁。...

樊先知樊先知的博客 725

Java实现生产者和消费者模式

从生产者、消费者模型会出现的问题出发,谈了一下对生产者、消费者模型的理解,并配有完整的代码实现。

扬帆向海的博客 1万+

java实现生产者和消费者

本篇博文主要介绍如何使用java来实现简单的生产者和消费者 来帮助大家简单的入门理解生产者和消费者模式 一、对生产者消费者的理解 生产者消费者模式是并发、多线程编程中经典的设计模式。 简单来看,就是一个类负责生产,一个类负责消费。举例来说,一个变量,生产者不断增加这个变量,消费者不断减少这个变量。在互联网应用中,抢票机制就是应用了该模式,比如大麦网演唱会门票抢票,12306火车票抢票等。

fallwind_of_july的博客 1万+

java生产者消费者 阻塞_Java设计模式—生产者消费者模式(阻塞队列实现)

生产者消费者模式是并发、多线程编程中经典的设计模式,生产者和消费者通过分离的执行工作解耦,简化了开发模式,生产者和消费者可以以不同的速度生产和消费数据。这篇文章我们来看看什么是生产者消费者模式,这个问题也是多线程面试题中经常被提及的。如何使用阻塞队列(Blocking Queue)解决生产者消费者模式,以及使用生产者消费者模式的好处。真实世界中的生产者消费者模式生产者和消费者模式在生活当中随处可见...

weixin_42113552的博客 223
上一篇: python股票量化交易从入门到实践df_Python股票量化交易从入门到实践/金融科技系列...
下一篇: 基本农田卫星地图查询_中国北斗已启用全球服务,如何使用手机北斗卫星导航?...
weixin_39568653
博客等级 码龄9年 32粉丝 134原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值