多线程之生产者消费者模型

article/2025/9/28 7:23:54

生产者消费者模型

  • 1.为什么要使用生产者和消费者模式
  • 2.案例

1.为什么要使用生产者和消费者模式

在线程开发中,生产者就是生产线程的线程,消费者就是消费线程的线程。在多线程开发中,如果生产者如理数据很快,消费者处理数据很慢,那么生产者必须等消费者处理完数据才能生产数据。如果消费者的处理能力大于生产者,那么消费者又必须等待生产者。为了解决这个问题,所以我们引入了生产者和消费者模型。

2.案例

就拿食品店来举个例子。我们要构造一家食品点,我们首先需要有食物。

/*** 食物类* @author 86184**/
public class Food {private String name;//全参构造public Food(String name) {this.name=name;}@Overridepublic String toString() {return "Food [name=" + name + "]";}}

其次,我们需要将这家食品店造出来,并且完善食品店的功能。比如贩卖食品。。。

/*** 商店的生产模式和消费模式·* @author 86184**/
public class KFC {private Deque<Food> q = new LinkedList<Food>();//缓存获取食物队列private  final int MAX_SIZE =10;//商店的生产模式public synchronized void produce() {while(q.size()==MAX_SIZE) {System.out.println("队列已满,生产者休息等待消费者消费...");try {wait();} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}}Food food = new Food("汉堡");q.offer(food);//添加到队列中System.out.println("生产者生产一个:"+ food+",还有食物: "+ q.size());notifyAll();}//商店的消费模式public synchronized void consume() {while(q.isEmpty()) {System.out.println("队列已空,消费者休息,等待生产者生产.....");try {wait();} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}}Food food =q.poll();System.out.println("消费者消费一个:"+food+",还有食物:"+q.size());notifyAll();}}

3.既然商店和食品都已经准备完毕。我们就可以准备开业了。此时此刻,我们需要模拟雇佣厨师和顾客来购物时的情形了。

/*** 生产者的生产线程* @author 86184**/
public class ProducerThread extends Thread{private KFC kfc;public ProducerThread(KFC kfc) {this.kfc=kfc;}@Overridepublic void run() {while(true) {kfc.produce();try {sleep(200);} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}}
/*** 消费者线程* @author 86184**/
public class ConsumerThread extends Thread{private KFC kfc;ConsumerThread(KFC kfc) {this.kfc=kfc;}@Overridepublic void run() {while(true) {kfc.consume();try {sleep(400);} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}
}

最后,让我们来测试一下

public class Test {public static void main(String[] args) {KFC kfc =new KFC();Thread t1 =new ProducerThread(kfc);Thread t2 =new ProducerThread(kfc);Thread t3 =new ProducerThread(kfc);Thread c1 = new ConsumerThread(kfc);Thread c2 = new ConsumerThread(kfc);Thread c3 = new ConsumerThread(kfc);Thread c4 = new ConsumerThread(kfc);Thread c5 = new ConsumerThread(kfc);t1.start();t2.start();t3.start();c1.start();c2.start();c3.start();c4.start();c5.start();}}

在这里插入图片描述


http://chatgpt.dhexx.cn/article/eONfGhk5.shtml

相关文章

生产者消费者模型(多线程工作)

目录 1.模型前提 2.阻塞队列&#xff08;消费场所&#xff09; 3. 实验 4.有关效率 1.模型前提 以单生产者对单消费者为例子&#xff1a; 前提一&#xff1a;有一个缓冲区作为消费场所。 前提二&#xff1a;有两种功能不同的线程分别具有消费与生产的能力。 前提三&…

生产者消费者模型的实现(线程通信)

✅作者简介&#xff1a;我是18shou&#xff0c;一名即将秋招的java实习生 &#x1f525;系列专栏&#xff1a;牛客刷题专栏 &#x1f4c3;推荐一款模拟面试、刷题神器&#x1f449; [在线刷题面经模拟面试](在线面试刷题) 目录 实现一&#xff1a; 实现二&#xff1a; 实现一…

生产者消费者模型【新版】

目录 啥是生产者消费者模型? 生产者消费者模型存在问题??如何进行解决呢?? 生产者消费者模型导致的问题 什么是阻塞队列 生产者消费者模型优点 生产者消费者模型实现 Message MessageQueue 获取消息get方法 生产消息take方法 测试生产者消费者模型 啥是生产者消…

【Linux】生产者消费者模型

文章目录 一. 什么是生产者消费者模型1. 基本概念2. 三种关系3. 再次理解生产者消费者模型 二. 生产者消费者模型的优点三. 基于BlockingQueue的生产者消费者模型1. 准备工作2. 阻塞队列实现3. 测试阻塞队列4. 阻塞队列完整代码5. 关于改进阻塞队列的几点补充5.1 多生产者多消费…

生产者与消费者模型

1、【什么是生产者与消费者模型呢&#xff1f;】 一种重要的模型&#xff0c;基于等待/通知机制。生产者/消费者模型描述的是有一块缓冲区作为仓库&#xff0c;生产者可将产品放入仓库&#xff0c;消费者可以从仓库中取出产品&#xff0c;生产者/消费者模型关注的是以下几个点&…

生产者消费者模型——C语言代码详解

概念 生产者消费者模式就是通过一个容器来解决生产者和消费者的强耦合问题。生产者和消费者彼此之间不直接通讯&#xff0c;而通过阻塞队列来进行通讯&#xff0c;所以生产者生产完数据之后不用等待消费者处理&#xff0c;直接扔给阻塞队列&#xff0c;消费者不找生产者要数据…

【Java总结】生产者消费者模型

生产者消费者模型主要结构如下&#xff0c;是一个典型的线程同步的案例。下面就来使用java做几种线程同步的方式来实现以下该模型 确保一个生产者消费者模型的稳定运行的前提有以下几个 生成者应该具备持续生成的能力消费者应该具备持续消费的能力生产者的生成和消费消费有一定…

【设计模式】生产者消费者模型

带你轻松理解生产者消费者模型&#xff01;生产者消费者模型可以说是同步与互斥最典型的应用场景了&#xff01;文末附有模型简单实现的代码&#xff0c;若有疑问可私信一起讨论。 文章目录 一&#xff1a;为什么要使用生产者消费者模型&#xff1f;二&#xff1a;生产者消费者…

模拟生产者消费者模型

生产者消费者是多线程很经典的一个模型 牵涉三个对象&#xff1a;仓库、生产者、消费者 仓库代表共享变量 生产者表示在仓库生产货物 消费者表示从仓库拿出货物 实现思路&#xff1a;利用synchronizedwait()notify() 对生产者消费者对应的操作用synchronized关键字保证线程安全…

生产者消费者模型java实现

做题的时候遇到了生产者消费者问题&#xff0c;这个问题可以说是线程学习的经典题目了&#xff0c;就忍不住研究了一波。它描述是有一块缓冲区&#xff08;队列实现&#xff09;作为仓库&#xff0c;生产者可以将产品放入仓库&#xff0c;消费者则可以从仓库中取走产品。在Java…

生产者消费者模型详解以及实现

生产者消费者模式 我们先来看看什么是生产者消费者模式&#xff0c;生产者消费者模式是程序设计中非常常见的一种设计模式&#xff0c;被广泛运用在解耦、消息队列等场景。在现实世界中&#xff0c;我们把生产商品的一方称为生产者&#xff0c;把消费商品的一方称为消费者&…

Java生产者消费者模型的五种实现方式

转自&#xff1a;https://juejin.im/entry/596343686fb9a06bbd6f888c 前言 生产者和消费者问题是线程模型中的经典问题&#xff1a;生产者和消费者在同一时间段内共用同一个存储空间&#xff0c;生产者往存储空间中添加产品&#xff0c;消费者从存储空间中取走产品&#xff0c…

生产者消费者模型---详解及代码实现

概念 生产者消费者模式就是通过一个容器来解决生产者和消费者的强耦合问题。生产者和消费者彼此之间不直接通讯&#xff0c;而通过阻塞队列来进行通讯&#xff0c;所以生产者生产完数据之后不用等待消费者处理&#xff0c;直接扔给阻塞队列&#xff0c;消费者不找生产者要数据…

生产消费者模型

生产消费者模型中包含三个部分&#xff0c;生产者、消费者和交易场所。其中涉及如下的关系&#xff1a; &#xff08;1&#xff09;生产者和生产者之间的关系&#xff1a;由于生产者的生产面向的都是交易场所&#xff0c;所以生产者之间是存在竞争关系的&#xff0c;就像一家超…

生产者-消费者模型

什么是生产者消费者模型 生产者 - 消费者模型&#xff08; Producer-consumer problem&#xff09; 是一个非常经典的多线程并发协作的模型&#xff0c;在分布式系统里非常常见。 这个模型由两类线程和一个缓冲区组成来组成 生产者线程&#xff1a;生产数据&#xff0c;并把…

最长上升子序列和最长公共子序列

文章目录 文章目录 文章目录一、基本知识二、最长上升子序列1.朴素版2.二分版 三、最长公共子序列 一、基本知识 1.子串和子序列的区别&#xff1a; 子串必须连续,子序列可以不连续。 2.最长上升子序列(LIS)&#xff1a; 是指一个序列中最长的单调递增的子序列。 3.最长公共…

求最长子序列及回溯

D - 最长公共子序列问题 Description 给定两个序列 X{x1,x2,…,xm} 和 Y{y1,y2,…,yn}&#xff0c;找出X和Y的最长公共子序列。 Input 输入数据有多组&#xff0c;每组有两行 &#xff0c;每行为一个长度不超过500的字符串&#xff08;输入全是大写英文字母&#xff08;A,Z…

算法14-求最长子序列

题目&#xff1a; 给定数组arr。求最长的有序子序列的长度&#xff0c;返回长度int 分析&#xff1a; 1 要求的子串是有序的&#xff0c;就要比大小 2 用最暴力大方法&#xff0c;看成窗口问题&#xff0c;每一个元素求出它左边的最长序列子串&#xff0c;写入一个数组dp&…

最长子序列——动态规划

动态规划算法通常用于求解具有某种最优性质的问题。动态规划算法与分治法类似&#xff0c;其基本思想也是将待求解问题分解成若干个子问题&#xff0c;先求解子问题&#xff0c;然后从这些子问题的解得到原问题的解。与分治法不同的是&#xff0c;适合于用动态规划求解的问题&a…

最长公共子串与最长子序列

一 序 本文属于《图解算法》系列&#xff0c;上一篇整理了动态规划&#xff0c;动态规划可以帮助我们解决给定约束条件下找到最优解&#xff0c;例如背包问题。 在问题可分解为彼此独立且离散的子问题时&#xff0c;就可使用动态规划来解决。 在看个例子&#xff0c;求两个字…