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

article/2025/9/29 9:17:11

一.概述
在这里插入图片描述
1. 什么是“生产者消费者模式”?
生产线程负责生产,消费线程负责消费
生产线程和消费线程要达到均衡。
生产满了就不能继续生产了,必须让消费线程进行消费
消费完了就不能再消费了,必须让生产线程进行生产
这是一种特殊的业务需求,在这种特殊的情况下,需要使用wait()和notify()方法

2.wait和notify方法
wait和notify方法不是线程当中的方法,是任何一个Java 对象 都有的方法(Object自带的,不是线程去调用)

3.wait()方法的作用?
①让正在当前线程(o对象上活动的线程)进入等待状态(Monitor中的waitSet),无期限等待,直到调用o.notify方法被唤醒为止。
释放所占有的的对象锁

4.notify()方法的作用? (notify: 通知)
对象o.notify可以唤醒正在o对象上等待的线程。只是通知,不会释放对象锁

notifyAll()方法可以唤醒o对象上处于等待的所有线程 / 没有waitAll !

二.简单实现
需求:仓库用List集合表示,List集合中假设只能存储1个元素,1个元素就表示仓库满了
如果List集合中元素的个数是0,就表示仓库空了
保证List集合中永远都是最多存储1个元素
必须做到这种效果:生产1个消费1个。

//生产者
class producer extends Thread{   //创造线程第一种方式private List list;public producer(List list){this.list=list;}@Overridepublic void run() {while(true) {  //死循环 反复生产synchronized (list) {  // 保证list的线程安全if(list.size()>0){try{list.wait();  //仓库满了则 1.阻塞生产者  2.释放list的对象锁}catch(Exception e){e.printStackTrace();}}else{ //仓库没满,则生产Object o=new Object();list.add(o);System.out.println(Thread.currentThread().getName()+" 生产了:" +o);list.notify(); //生产完了,唤醒list上的消费者进行消费}}}}
}//消费者
class consumer extends Thread{private List list;public consumer(List list){this.list=list;}@Overridepublic void run(){while(true){ //循环  反复消费synchronized (list){if(list.size()==0){try{list.wait(); //如果仓库为空,消费者1.阻塞消费者 2.释放list的对象锁}catch(Exception e){e.printStackTrace();}}else{Object o = list.remove(0); //返回被删除的元素System.out.println(Thread.currentThread().getName()+" 消费了:" +o);list.notify(); //消费了,要唤醒生产者}}}}
}public class test01{public static void main(String[] args) {List list=new ArrayList();Thread t1=new producer(list);Thread t2=new consumer(list);t1.setName("生产者线程");t2.setName("消费者线程");t1.start();t2.start();}
}

效果:在这里插入图片描述
注意

  1. 生产完了要唤醒消费者;消费完了要唤醒生产者
  2. 对象 .wait() 方法会阻塞线程,且会释放对象上的锁

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

相关文章

实现生产者消费者模式的三种方式

什么是生产者消费者模式 简单来说,生产者消费者模式就是缓冲区。 那么这么做有两个好处,一个是解耦,第二个是平衡生产能力和消费能力的差,因为生产者和消费者的速度是不一样的,有了这个缓冲区就可以平衡这样一个落差&…

生产者消费者模式最佳实践

测试环境:ubuntu18.04opencv4.2Qt 一个生产者-消费者模式下的视频处理框架。基础结构:视频读取类线程不断读取视频帧,处理类线程对图像进行处理,之后通过信号与槽机制在主线程中显示。特点:视频读取、处理为独立线程&a…

生产者、消费者模式

架构设计:生产者/消费者模式[0]:概述 今天打算来介绍一下“生产者/消费者模式”,这玩意儿在很多开发领域都能派上用场。由于该模式很重要,打算分几个帖子来介绍。今天这个帖子先来扫盲一 把。如果你对这个模式已经比较…

生产者和消费者模式详解

★简介 生产者消费者模式并不是GOF提出的23种设计模式之一,23种设计模式都是建立在面向对象的基础之上的,但其实面向过程的编程中也有很多高效的编程模式,生产者消费者模式便是其中之一,它是我们编程过程中最常用的一种设计模式。…

生产者消费者模式+代码实现

在并发编程中使用生产者和消费者模式能够解决绝大多数并发问题。该模式通过平衡生产线程和消费线程的工作能力来提高程序的整体处理数据的速度。 为什么要使用生产者和消费者模式 在线程世界里,生产者就是生产数据的线程,消费者就是消费数据的线程。在…

生产者消费者模式详解(转载)

★简介 在实际的软件开发过程中,经常会碰到如下场景:某个模块负责产生数据,这些数据由另一个模块来负责处理(此处的模块是广义的,可以是类、函数、线程、进程等)。产生数据的模块,就形象地称为生…

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

文章目录 基本组成阻塞队列有界队列与无界队列ArrayBlockingQueueLinkedBlockingQueueSynchronousQueue 流量控制与信号量(Semaphore)双缓冲与Exchanger 基本组成 生产者:生产者的任务是生产产品,产品可以是数据,也可以是任务。(将产品存入传…

java 生产者消费者模式

java的生产者消费者模式,有三个部分组成,一个是生产者,一个是消费者,一个是缓存。 这么做有什么好处呢? 1.解耦(去依赖),如果是消费者直接调用生产者,那如果生产者的代码变动了,消费…

生产者消费者模式浅析

由于最近工作中,涉及到生产者消费者设计模式,对此有一些体会,所以总结一下,与大家分享。 什么是生产者消费者模式 在工作中,大家可能会碰到这样一种情况:某个模块负责产生数据,这些数据由另一个…

java实现生产者消费者模式

一: 什么是生产者消费者模型 生产者消费者模式是通过一个容器来解决生产者和消费者的强耦合问题。生产者和消费者彼此之间不直接通讯,而通过阻塞队列来进行通讯,所以生产者生产完数据之后不用等待消费者处理,直接扔给阻塞队列,消费…

【Java】生产者消费者模式的实现

前言 生产者消费者问题是线程模型中的经典问题:生产者和消费者在同一时间段内共用同一存储空间,生产者向空间里生产数据,而消费者取走数据。 阻塞队列就相当于一个缓冲区,平衡了生产者和消费者的处理能力。这个阻塞队列就是用来…

生产者/消费者模式

[0]:概述 今天打算来介绍一下“生产者/消费者模式”,这玩意儿在很多开发领域都能派上用场。由于该模式很重要,打算分几个帖子来介绍。今天这个帖子先来扫盲一把。如果你对这个模式已经比较了解,请跳过本扫盲帖&#x…

(四)生产者消费者模式

(一)生产者消费者模式原理: 在一个系统中,存在生产者和消费者两种角色,他们通过内存缓冲区进行通信,生产者生产消费者需要的资料,消费者把资料做成产品。生产消费者模式如下图: (二…

【C++】【设计模式之】生产者-消费者模型(理论讲解及实现)

一、什么是生产者-消费者模型 1、简单理解生产者-消费者模型 假设有两个进程(或线程)A、B和一个固定大小的缓冲区,A进程生产数据放入缓冲区,B进程从缓冲区中取出数据进行计算,这就是一个简单的生产者-消费者模型。这里…

设计模式——生产者消费者模式

1 基本概括 2 主要介绍 2.1 概念 生产者消费者模式是通过一个容器来解决生产者和消费者的强耦合问题。生产者和消费者彼此之间不直接通讯,而通过阻塞队列来进行通讯,所以生产者生产完数据之后不用等待消费者处理,直接扔给阻塞队列&#xff…

生产者消费者模式三种实现方式

目录 1.什么是生产者消费者模式:2.生产者消费者模型的实现:第一种:使用 synchronized和wait、notify第二种:使用 Lock和await、signal第三种:使用 阻塞队列 BlockingQueue 1.什么是生产者消费者模式: 生产…

t-SNE算法

t-SNE(t-distributed stochastic neighbor embedding)是用于降维的一种机器学习算法,是由 Laurens van der Maaten 和 Geoffrey Hinton在 08 年提出来。t-SNE 是一种非线性降维算法,非常适用于高维数据降维到 2 维或者 3 维,进行可视化。在实…

t-SNE概述

为了循序渐进, 先来学习SNE. SNE 无论是多维数据还是词向量, 都是一个个散落在空间中的点, 点与点之间距离近的, 就可以看作属于同一分类或近义词. 衡量两点距离有很多种手段, 但最常用的还是欧式距离, 所以欧氏距离与相似度的关系可以用某种公式近似表达, 这样就可以把空间信…

机器学习笔记 - 什么是t-SNE?

1、t-SNE概述 t-Distributed Stochastic Neighbor Embedding (t-SNE) 是一种无监督的非线性技术,主要用于数据探索和高维数据的可视化。简单来说,t-SNE 让您对数据在高维空间中的排列方式有一种感觉或直觉。它由 Laurens van der Maatens 和 Geoffrey Hinton 于 2008 年提出。…

可视化降维方法 t-SNE

本篇主要介绍很好的降维方法t-SNE的原理 详细介绍了困惑度perplexity对有效点的影响首先介绍了SNE然后在SNE的基础上进行改进:1.使用对称式。2.低维空间概率计算使用t分布 t-SNE(t分布和SNE的组合) 以前的方法有个问题:只考虑相…