java多线程初探(零)生产者消费者模式-线程通信

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

测试类

package gcc.twoThreadTransData.producerAndConsumer;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * 多个线程之间通信
 * 消费者生产者模式
 * 多个生产者和消费者
 * 流程:
 * 多个线程(生产者,消费者)公用一把锁
 * 本例设置了两个生产者线程和两个消费者线程
 * 启动线程,run方法内循环调用生产和消费方法
 * 无数据,生产,notifyAll唤醒所有wait等待(不管是消费者的还是生产者的)
 * 有数据,不生产,wait等待
 * 有数据,消费,数据置空,notifyAll唤醒所有wait等待
 * 无数据,不消费,wait等待
 */
public class TestPCModel {

    protected static Logger logger = LoggerFactory.getLogger(TestPCModel.class);

    public static void main(String[] args) throws InterruptedException {
        String lock =  new String("");
        Producer p = new Producer(lock);
        Consumer c = new Consumer(lock);
        ThreadP[] pThread = new ThreadP[2];
        ThreadC[] cThread = new ThreadC[2];
        for (int i = 0; i <2 ; i++) {
            pThread[i]=new ThreadP(p);
            pThread[i].setName("生产者-"+i);
            cThread[i]=new ThreadC(c);
            cThread[i].setName("消费者-"+i);
            pThread[i].start();
            cThread[i].start();
        }
        /*Thread.sleep(2000);
        Thread[] threadArray = new Thread[Thread.currentThread().getThreadGroup().activeCount()];
        Thread.currentThread().getThreadGroup().enumerate(threadArray);
        for (int i = 0; i <threadArray.length ; i++) {
            logger.info(threadArray[i].getName()+"---"+threadArray[i].getState());
        }*/

    }

}

生产者类

package gcc.twoThreadTransData.producerAndConsumer;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class Producer {

    protected static Logger logger = LoggerFactory.getLogger(Producer.class);

    private String lock;
    public Producer(String lock){
        this.lock=lock;
    }

    public void setValue(){
        try {
            synchronized (lock) {
                while (!"".equals(ValueObject.value)){
                    logger.info("已生产,等待消费:"+Thread.currentThread().getName());
                    lock.wait();
                }
                logger.info("开始生产:"+Thread.currentThread().getName());
                String value=System.currentTimeMillis()+"--"+System.nanoTime();
                ValueObject.value=value;
                lock.notifyAll();
            }
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

}

消费者类

package gcc.twoThreadTransData.producerAndConsumer;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class Consumer {

    protected static Logger logger = LoggerFactory.getLogger(Consumer.class);

    private String lock;
    public Consumer(String lock){
        this.lock=lock;
    }

    public void getValue(){
        try {
            synchronized (lock) {
                while (ValueObject.value.equals("")){
                    logger.info("已消费完:"+Thread.currentThread().getName());
                    lock.wait();
                }
                logger.info("开始消费:"+Thread.currentThread().getName());
                ValueObject.value="";
                lock.notifyAll();
            }
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

}

生产者线程

package gcc.twoThreadTransData.producerAndConsumer;

public class ThreadP extends Thread{

    private Producer producer;
    public ThreadP(Producer producer){
        this.producer=producer;
    }

    public void run(){
        while (true){
            producer.setValue();
        }
    }

}

消费者线程

package gcc.twoThreadTransData.producerAndConsumer;

public class ThreadC extends Thread{

    private Consumer consumer;
    public ThreadC(Consumer consumer){
        this.consumer=consumer;
    }

    public void run(){
        while (true){
            consumer.getValue();
        }
    }

}

辅助类

package gcc.twoThreadTransData.producerAndConsumer;

public class ValueObject {

    public static String value="";

}

 

鸿蒙(HarmonyOS)实战开发篇——ArkTS多线程的多线程系列(四):基于生产者-消费者实现多线程协同 生产者-消费者模式是一种经典的多线程设计模式,它为多线程间的协同提供了良好的解决方案。在生产者-消费者模式中,通常有两类线程,即若干个生产者线程和若干个消费者线程。生产者线程负责提交用户请求,消费线程负责具体处理生产者提交的任务。生产者和消费者直接则通过共享内存缓冲区进行通信。从图中可以得看出生产者-消费者模式的如下优点性能提升:将一个耗时的流程拆成生产和消费两个阶段。业务解耦:共享内存缓冲区作为生产者线程和消费者线程间的通信桥梁,避免了生产者线程与消费者线程直接通信,从而将两类线程进行解耦。 阅读详情

相关推荐

Java多线程之生产者与消费者

随着软件业的发展,互联网用户的日渐增多,并发这门艺术的兴起似乎是那么合情合理。每日PV十多亿的淘宝,处理并发的手段可谓是业界一流。用户访问淘宝首页的平均等待时间只有区区几秒,但是服务器所处理的流程十分复杂。首先负责首页的服务器就有好几千台,通过计算把与用户路由最近的服务器处理首页的返回。其次是网页上的资源,就JS和CSS文件就有上百个,还有图片资源等。它能在几秒内加载出来可见阿里几千名顶尖工程师的智慧是如何登峰造极。...

daimenglaoshi的博客 1427

Java多线程学习笔记11之线程间通信

详细代码见:github代码地址   本节内容: 1) 等待/通知机制概念 2) 中断和轮询两种基本的方式 3) 等待/通知机制的实现 4) wait()/notify()/wait(long)/notifyAll()文档翻译   线程间通信 线程是操作系统中独立的个体,使线程间进行通信后,系统之间的交互性会更强大,在大大提高 CPU利用率的同时还会使程序员对各线程任务在处理...

you are sherlocked by me! 431

Java多线程系列—生产者消费者模式的多种实现(04)

生产者消费者模式 我们先来看看什么是生产者消费者模式,生产者消费者模式是程序设计中非常常见的一种设计模式,被广泛运用在解耦、消息队列等场景。 在现实世界中,我们把生产商品的一方称为生产者,把消费商品的一方称为消费者,有时生产者的生产速度特别快,但消费者的消费速度跟不上,俗称“产能过剩”,又或是多个生产者对应多个消费者时,大家可能会手忙脚乱。如何才能让大家更好地配合呢?这时在生产者和消费者之间就需要一个中介来进行调度,于是便诞生了生产者消费者模式。 使用生产者消费者模式通常需要在两者之间增加一个阻塞队列作为

6万+

java多线程初探(零)线程间通信

测试类: package gcc.twoThreadTransData.waitAndNotify; /** * 通过wait和notify来实现多线程间的通信,这样可以避免一直轮询的消耗 * wait和notify需要在同步代码块内调用 * 对正在wait的线程执行interrupt(),会报异常,同时释放锁 * * 1,代码执行到wait,等待执行,并释放锁 * 2,noti...

gcc_java的博客 213

深入理解生产者-消费者模式的多线程实现

生产者-消费者模式是一种在计算机科学中常见的设计模式,用于处理线程间共享资源的场景。在这种模式中,生产者线程负责产生数据,而消费者线程负责消费数据。这两个角色通过一个共享的缓冲区进行通信。生产者将生成的数据放入缓冲区,消费者从缓冲区取出数据进行处理。这种模式能够平衡生产速度和消费速度之间的不匹配问题,比如生产速度快于消费速度时,缓冲区可以防止过快生产的生产者阻塞;反之,当生产速度慢于消费速度时,缓冲区可以防止消费者线程因无数据可处理而空闲。

weixin_42509720的博客 1017

FFmpeg视频缩放终极指南:从基础命令到保持宽高比的5种实战技巧

本文是FFmpeg视频缩放的终极指南,详细讲解了从基础命令到保持宽高比的5种实战技巧。针对不同平台(如抖音、B站、Instagram)的分辨率要求,提供了具体的参数模板和批量处理脚本,帮助内容创作者高效、精准地调整视频大小,避免画面变形或黑边问题,实现多平台适配。

juice的博客 457

多线程-生产者和消费者模式的四种实现

什么是生产者和消费者模式: 生产者和消费者模式是通过一个容器来解决生产者和消费者的强耦合问题。生产者和消费者彼此并不直接通信,而是通过阻塞队列进行通信,所以生产者生产完数据后不用等待消费者进行处理,而是直接扔给阻塞队列,消费者不找生产者要数据,而是直接从阻塞队列中获取数据,阻塞队列就相当于一个缓冲区,平衡生产者和消费者的处理能力。 wait/notify和synchronized配合实现: 生产者...

Fly_Fly_Zhang的博客 7204

使用 pip 安装 pygame 遇到的问题

今天尝试学习使用 pygame 时,按照我的习惯一发 pip install 下去,本以为很简单的事情,没想到遇到了不少问题,顺手记录一下。 0x01. 无法找到 “SDL.h” 文件 pygame 是使用 SDL 库写就的游戏框架,自然强依赖于 SDL,我的 python@3 是使用 macOS 的 brew 管理器直接安装的,可能由于不是编译安装的问题,缺少了这个库,继续使用 brew 安...

Mitscherlich的博客 8621

Java多线程——生产者消费者问题

创建多个线程去执行不同的任务,如果这些任务之间有着某种关系,那么线程之间必须能够通信来协调完成工作。 生产者消费者问题(英语:Producer-consumer problem)就是典型的多线程同步案例,它也被称为有限缓冲问题(英语:Bounded-buffer problem)。该问题描述了共享固定大小缓冲区的两个线程——即所谓的“生产者”和“消费者”——在实际运行时会发生的问题。生产者的主要作用是生成一定量的数据放到缓冲区中,然后重复此过程。与此同时,消费者也在缓冲区消耗这些数据。该问题的关键就是要保

泯灭于众生,高歌于孤夜! 6689

SAP 零售 FMS 物料主数据(一)

SAP 零售 FMS 物料主数据(一) SAP 对于鞋服行业最新的解决方案-FMS(相当于原来的AFS+Retail);更偏向与零售; 商品主数据与原来的AFS大不相同,取消了原来的Grid的网格概念,取而代之的是变式;商品主数据维护也偏向于Retail的维护模式;事物代码也不是MM01而是MM41 /MM46; 在维护商品主数据前,需要与商品部沟通定义各种商品相关的规范如编码规则,大中小类 ,颜色库,尺码库等,此处不赘述; 创建商品需要确定哪些物料是变式物料,哪些是常规不带特性的单一物料;这决定了在创建商

weixin_45518759的博客 5061

告别理论!手把手教你用Patran/Nastran搞定悬臂翼的颤振分析(附完整模型文件)

本文提供了一份详细的Patran/Nastran悬臂翼颤振分析实战指南,涵盖从几何建模到结果解读的全过程。通过手把手教学和完整模型文件,帮助工程师和学生快速掌握气动弹性分析技术,特别适合需要实际操作的初学者。文章重点介绍了模态分析、气动建模和颤振求解等关键步骤,并提供了常见问题排查和优化建议。

weixin_30879169的博客 493

写给大忙人看的图解Java多线程之生产者与消费者设计模式

生产者与消费者读前建议深入理解Java线程安全——银行欠我400万!!!一分钟用睡前小故事图解Java线程之死锁一、情景设计二、引入生产者与消费者三、情景的代码再现 读前建议 如果需要对本文有更加深刻的了解建议了解一下线程安全、线程死锁、以及线程通信相关的知识,如果说您对这些已经有了足够的了解,相信你读完这篇博文一定收获颇丰! 深入理解Java线程安全——银行欠我400万!!! 一分钟用睡前小...

LukeyAlvin的博客 3218

海康威视GigE工业相机的python调用demo

默认路径安装完成后,在路径C:\Program Files (x86)\MVS\Development\Samples\Python\BasicDemo下的BasicDemo.py中,海康威视官方提供了基本的调用方法,本文也是基于这个修改的。BasicDemo.py提供了通过枚举选择相机的方法,在官方的另一个DEMO:ConnectSpecCamera.py中提供了另一种不通过枚举,直接访问特定IP相机的方法,也可以参考。另外,如果每台相机都定义了唯一的用户定义名,也可以通过用户定义名来区分相机。

xulibo5828的博客 2108

java 多线程并发系列之 生产者消费者模式的两种实现

生产者消费者模式是并发、多线程编程中经典的设计模式,生产者和消费者通过分离的执行工作解耦,简化了开发模式,生产者和消费者可以以不同的速度生产和消费数据。 真实世界中的生产者消费者模式 生产者和消费者模式在生活当中随处可见,它描述的是协调与协作的关系。比如一个人正在准备食物(生产者),而另一个人正在吃(消费者),他们使用一个共用的桌子用于放置盘子和取走盘子,生产者准备食物,如

小鱼的专栏 1万+

破解雪球网acw_sc__v2加密与无限debugger反爬策略

本文详细解析了雪球网的反爬机制,重点破解了其核心的acw_sc__v2加密参数与无限debugger反调试策略。通过实战案例,从抓包分析、逆向调试到算法还原,提供了完整的Python代码实现,帮助开发者掌握应对类似加密反爬的通用方法。

weixin_29207533的博客 1897

移远EC20模块USB模式切换的底层逻辑与驱动适配探秘

本文深入探讨了移远EC20模块USB模式切换的底层逻辑与驱动适配机制,详细解析了AT命令控制下的USB0与WWAN0模式差异。通过分析USB协议栈、内核驱动框架及网络子系统的交互,提供了模式切换的完整操作流程和常见问题解决方案,助力开发者优化4G通信模块在嵌入式设备中的稳定连接。

cc789的博客 844

多线程生产者消费者模型

1. 基础知识: 1. 什么是生产者-消费者模式: 比如有两个进程A和B,它们共享一个固定大小的缓冲区,A进程产生数据放入缓冲区,B进程从缓冲区中取出数据进行计算,那么这里其实就是一个生产者和消费者的模式,A相当于生产者,B相当于消费者。 2. 为什么要使用生产者消费者模式: 在多线程开发中,如果生产者生产数据的速度很快,而消费者消费数据的速度很慢,那么生产者就必须等待消费者消费完了数据才能够继续生产数据,因为生产那么多也没有地方放啊;同理如果消费者的速度大于生产者那么消费者就会经常处理等待状态,所以为了

dev_zyx的博客 1834

YOLO11改进:轻量级改进 | 通用倒瓶颈(UIB)搜索块结合C3k2二次创新 | 轻量化之王MobileNetV4

通用倒瓶颈(UIB)搜索块替代YOLO11的C3k2

会AI的学姐 293

线程通信的生产者消费者模式

小知识:在多线程里不要用if,使用while判断,防止虚假唤醒 普通版: package com.an.learning.thread; import java.util.concurrent.locks.Condition; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; class ShareData{ // 资源类 private int number

安余生的博客 3299

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

java多线程:线程间通信——生产者消费者模型

一、背景 && 定义 多线程环境下,只要有并发问题,就要保证数据的安全性,一般指的是通过 synchronized 来进行同步。 另一个问题是,多个线程之间如何协作呢? 我们看一个仓库出货问题(更具体一些,快餐店直接放好炸货的架子,不过每次只放一份) 假设仓库中只能存放一件商品,生产者将生产出来的产品放入仓库,消费者将仓库中产品取走进行消费; 如果仓库中没有商品,那么生产者将产品放入仓库,否则停止生产并等待,直到仓库中的产品被消费者取走为止; 如果仓库中放有产品,消费者可快速取走并消费,否

LifeGoesOn 970

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

剖析 Java 的多线程设计模式:生产者 - 消费者模式

生产者 - 消费者模式是构建高并发系统的基石,其实现方式随 Java 版本演进不断丰富。从基础的wait()notify()到现代的Reactor响应式编程,该模式始终围绕 “解耦与平衡” 的核心目标。在实际开发中,需根据业务场景选择合适的队列类型与线程管理策略,结合性能监控工具持续优化系统。未来,随着 Loom 虚拟线程的普及,生产者 - 消费者模式的实现将更加轻量高效,为云原生应用提供更强大的并发支持。

潜意识Java的博客 1290

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

利用Java多线程实现基本的生产者消费者

在一个进程中,可以同时生成多个线程,用于并发执行相同或不同的任务操作,可以提升程序的运行效率,使CPU、内存和IO相关的资源得到充分的利用,比如一个文件读写的操作,IO耗时较长,如果这时是单线程的,那么我们需要文件读写完成才能进行其他操作,这时候CPU资源是闲置的,相反如果使用多线程,一个线程在读写文件的同时,另一个线程可以利用CPU的闲置时间进行其他的计算操作,那么整个程序运行的时间就缩短了。2、生产完的产品堆放在一个运输线上,通知运输工人搬走,每次只能搬走一件产品。,完整代码,可独立运行。

jackiendsc的博客 972

【线程通信】生产者-消费者模式

一、简述 1️⃣生产者消费者模式并不是 GOF 提出的 23 种设计模式之一,23 种设计模式都是建立在面向对象的基础之上的,但其实面向过程的编程中也有很多高效的编程模式,生产者消费者模式便是其中之一,它是编程过程中最常用的一种设计模式。 一个常见的场景:某个模块负责产生数据,这些数据由另一个模块来负责处理(此处的模块是广义的,可以是类、函数、线程、进程等)。产生数据的模块,就形象地称为生产者;而处理数据的模块,就称为消费者。单单抽象出生产者和消费者,还够不上是生产者/消费者模式。该模式还需要有一个缓冲区处

ChineseSoftware的博客 969

java:多线程解决生产者消费者问题

一个简单的多线程问题,当处理逻辑不完善时,容易出现所有线程都在等待的死锁情况.我在一开始写的时候,使用的是notify()方法,这会导致每次只唤醒一条线程,但如果之前出现了消费者或生产者的连续抢到cpu控制权情况,之前沉睡的线程就并不止有一条,最终导致全部等待的死锁情况.贴两张运行结果直观一点。

qq_55630615的博客 1055

Java多线程08——生产者/消费者模式

多线程环境下,我们经常需要多个线程的并发和相互通信。其中,有一个重要的多线程并发协作模型,即“生产者/消费者模式”。生产者负责生产数据的模块,可以是方法、对象、线程或进程。消费者负责处理数据的模块,可以是方法、对象、线程或进程。缓冲区消费者不能直接使用生产者的数据,在生产者和消费者之间有一个“缓冲区”。生产者将生产好的数据和内容放入“缓冲区”,消费者从“缓冲区”中取走要处理的数据。实现线程的并发协作设置缓冲区后,生产者线程只需要向缓冲区里面放入数据,而不需要去查看消费者消费的情况;

QQ156881887的专栏 1316

多线程(生产者消费者模式)

所谓生产者消费者模式,即多个线程进行生产,同时多个线程进行消费,两种角色通过内存缓冲区进行通信, 优点:极大的解决了代码之间的耦合程度 解耦 假设生产者和消费者分别是两个类。如果让生产者直接调用消费者的某个方法,那么生产者对于消费者就会产生依赖(也就是耦合)。将来如果消费者的代码发生变化,可能会影响到生产者。而如果两者都依赖于某个缓冲区,两者之间不直接依赖,耦合也就相应降低了。 //测试:生产者消...

zhangqiang180的博客 1041
上一篇: java多线程初探(零)线程间通信
下一篇: java多线程初探(零)使用Lock-线程间通信
gcc_front
博客等级 码龄9年 16粉丝 98原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值