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

article/2025/9/28 7:28:50

 ✅作者简介:我是18shou,一名即将秋招的java实习生

🔥系列专栏:牛客刷题专栏

📃推荐一款模拟面试、刷题神器👉 [在线刷题面经模拟面试](在线面试刷题)

目录

 实现一:

 实现二: 


实现一:

package com.atguigu.juc;import java.util.LinkedList;public class ProductConsumerTest2 {public static void main(String[] args) {MessageQueue messageQueue = new MessageQueue(3);for (int i = 0; i <= 3; i++) {int id=i;new Thread(()->{while(true){messageQueue.produce(new Message(id,id));}},"生产者").start();}new Thread(()->{while(true){try {Thread.sleep(1);} catch (InterruptedException e) {e.printStackTrace();}messageQueue.take();}},"消费者").start();}
}class MessageQueue{private LinkedList<Message> list=new LinkedList<>();private int capCity;public MessageQueue(int capCity) {this.capCity = capCity;}public void take(){synchronized (list){//消费if(list.isEmpty()){try {list.wait();} catch (InterruptedException e) {e.printStackTrace();}}else {Message message = list.removeFirst();System.out.println("消费者消费"+message.getId()+" "+message.getVal());list.notify();//这里注意要用list调用notify  不然锁的对象不同}}}public void produce(Message message){//生产synchronized (list){if(list.size() == capCity){try {list.wait();} catch (InterruptedException e) {e.printStackTrace();}System.out.println("生产者已生产满仓");}else {list.add(new Message(message.getId(),message.getVal()));System.out.println("生产者生产"+message.getId()+" "+message.getVal());list.notify();//这里注意要用list}}}}class Message{private int id;private int val;@Overridepublic String toString() {return "Message{" +"id=" + id +", val=" + val +'}';}public Message(int id, int val) {this.id = id;this.val = val;}public int getId() {return id;}public int getVal() {return val;}
}

 实现二: 

package com.atguigu.thread;/*** 线程通信的应用:经典例题: 生产者消费者问题*/
public class ProduceConsumerTest {public static void main(String[] args) {Clerk clerk = new Clerk();Producer p1 = new Producer(clerk);Consumer c1 = new Consumer(clerk);p1.start();c1.start();}
}
class Clerk{private int product = 0;public void produce() {while(true){synchronized (this){
//                this.notify();if(product < 20){try {Thread.sleep(10);} catch (InterruptedException e) {e.printStackTrace();}product++;System.out.println(Thread.currentThread().getName()+"生产者生产产品"+product);this.notify();}else {try {wait();} catch (InterruptedException e) {e.printStackTrace();}}}}}public void consume() {while (true) {synchronized (this) {
//                this.notify();if (product > 0) {try {Thread.sleep(10);} catch (InterruptedException e) {e.printStackTrace();}product--;System.out.println(Thread.currentThread().getName() + "消费者消费产品" + product);this.notify();} else {try {wait();} catch (InterruptedException e) {e.printStackTrace();}}}}}
}class Producer extends Thread{private Clerk clerk;public Producer(Clerk clerk){this.clerk=clerk;}@Overridepublic void run() {clerk.produce();}
}class Consumer extends Thread{private Clerk clerk;public Consumer(Clerk clerk){this.clerk=clerk;}@Overridepublic void run() {clerk.consume();}
}


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

相关文章

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

目录 啥是生产者消费者模型? 生产者消费者模型存在问题??如何进行解决呢?? 生产者消费者模型导致的问题 什么是阻塞队列 生产者消费者模型优点 生产者消费者模型实现 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;求两个字…

动态规划:最长子序列

最长公共子序列&#xff1a; 链接&#xff1a;https://www.nowcoder.com/questionTerminal/9ae56e5bdf4f480387df781671db5172 题目&#xff1a; 我们有两个字符串m和n&#xff0c;如果它们的子串a和b内容相同&#xff0c;则称a和b是m和n的公共子序列。子串中的字符不一定在原字…

C++最长子序列

LeedCode-300. 最长上升子序列 LeetCode-300. 最长上升子序列 方法一&#xff1a;O(n^2)可能会超时&#xff1b;方法二&#xff1a;贪心二分法&#xff0c;使用lower_bound()&#xff1b; 下面是贪心二分算法&#xff1a; 由于要得到最长的递增子序列&#xff0c;就要让序列…