线程之间的通信之消费者与生产者

生产者 消费者 模式 c++ 生产者 消费者 模式 c++ 算是老外写的一个使用demo 可以参考一下 立即下载

线程之间通信

       生产者与消费者:生产者生产水果,消费者购买水果,当消费着购买水果时,要判断有没有水果,如果有,则购买,并且将水果的状态变为无,然后通知生产者没有水果了,请生产,若果无则等待生产者生产水果,生产者生产水果时,也要判断水果的状态,若果还有则不生产,等待消费者购买后再生产,如果没有水果,则生产,生产完后将水果状态变为有,并且通知消费者来购买。

我们首先建一个水果类:

package ThreadConnection;

/**
 * 这是一个水果类,有名称和是否存在两个属性
 */
public class Fruit {
    private String name;
    private boolean isExist;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public boolean isExist() {
        return isExist;
    }

    public void setExist(boolean exist) {
        isExist = exist;
    }
}

然后建一个生产者类,实现Runnable接口:

package ThreadConnection;

/**
 * 这是一个生产者类
 */
public class FruitProduct implements Runnable{
    //声明一个水果类
    private Fruit fruit;

    public FruitProduct(Fruit fruit) {
        super();
        this.fruit = fruit;
    }

    @Override
    public void run() {
        while (true){
            //同步锁
            synchronized (fruit){
                //如果水果已经存在,就不必再生产,等待消费者来购买即可
                if (fruit.isExist()){
                    try {
                        System.out.println("还没卖完,等待消费者购买"+fruit.getName()+".......");
                        //线程等待中。。。。
                        fruit.wait();

                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }


                }
                //如果水果是不存在的,则生产一个水果,将水果的存在属性变为true,并且唤醒消费者的购买线程
                fruit.setExist(true);
                System.out.println(fruit.getName()+"被生产出来了!");
                //唤醒消费者线程
                fruit.notify();
            }
        }
    }
}

再建一个消费者类,实现Runnable接口:

package ThreadConnection;

/**
 * 这是一个消费者类
 */
public class FruitBay implements Runnable{
    private Fruit fruit;

    public FruitBay(Fruit fruit) {
        super();
        this.fruit = fruit;
    }

    @Override
    public void run() {
        while (true){
            //同步锁
            synchronized (fruit){
                //若果水果不存在,则不进行购买,等待生产者生产出水果
                if (!fruit.isExist()){
                    try {
                        System.out.println("买完了,等待生产者生产"+fruit.getName()+".......");
                        //线程等待
                        fruit.wait();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
                //如果水果存在,则购买水果,并将水果的存在属性变为false,并通知生产者生产水果
                fruit.setExist(false);
                System.out.println(fruit.getName()+"被买走了!");
                //唤醒生产者线程
                fruit.notify();
            }
        }
    }
}

最后建一个测试类:

package ThreadConnection;

/**
 * 测试类
 */
public class TestMain {
    public static void main(String[] args) {
        //实例化一个水果类,并命名为哈密瓜,状态为存在
        Fruit fruit=new Fruit();
        fruit.setName("哈密瓜");
        fruit.setExist(true);
        //实例化一个生产者线程类和一个消费者线程类
        FruitBay fruitBay=new FruitBay(fruit);
        FruitProduct fruitProduct=new FruitProduct(fruit);
        //差UN关键生产者和消费者线程
        Thread t1=new Thread(fruitBay);
        Thread t2=new Thread(fruitProduct);
        //启动线程
        t1.start();
        t2.start();
    }
}
运行结果:




基于h5端的视频录制和回溯功能的实现 整理了一套《前端大厂面试宝典》,包含了HTML、CSS、JavaScript、HTTP、TCP协议、浏览器、VUE、React、数据结构和算法,一共201道面试题,并对每个问题作出了回答和解析。 阅读详情

相关推荐

基于单片机控制的开关电源设计

采用开关电源技术和MCU模块,凭借可靠性高、易于调适的特点,可以更高效地发挥出二者的优势,从而实现更好的组合。stm32的起动模式是通过Boot0和Boot1两个管脚的高低电平来决定的,当stm32被供电之后,这两个管脚的电平。在 VCC上,键盘的一头(列线)被连接到 VCC上,而在“0”的编程输出中,则用来进。,在开关管打开的情况下,由输入电力供给电流,感应装置存储   Buck变换器是一种非隔离式的电压转换器[10]整流电路对输入电压进行整流,再经过滤波电路,即Dc电压是直流/直流变换器的直流输入。

QQ1694456187的博客 2308

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

一、什么是生产者-消费者模型 1、简单理解生产者-消费者模型 假设有两个进程(或线程)A、B和一个固定大小的缓冲区,A进程生产数据放入缓冲区,B进程从缓冲区中取出数据进行计算,这就是一个简单的生产者-消费者模型。这里的A进程相当于生产者,B进程相当于消费者。 2、为什么要使用生产者-消费者模型 在多线程开发中,如果生产者生产数据的速度很快,而消费者消费数据的速度很慢,那么生产者就必须等待消费者消费完数据才能够继续生产数据,因为生产过多的数据可能会导致存储不足;同理如果消费者的速度大于生产者那么消费者就会经常

格物致知 1万+

LSS(Lift, Splat, Shoot)算法解析

**LSS(Lift, Splat, Shoot)** 是一个比较经典的自下而上的构建BEV特征的3D目标检测算法,通过将图像特征反投影到3D空间生成伪视锥点云,通过`Efficientnet`算法提取云点的深度特征和图像特征并对深度信息进行估计,最终将点云特征转换到BEV空间下进行特征融合和后续的语义分割任务。 本篇按照LSS代码的运行逻辑,结合论文对LSS算法进行解析。

超爱吃小蛋糕的66的博客 8680

生产者消费者模式(c++实现)

c++实现生产者消费者模式

dsjfhdwasfhgakjs的博客 1713

Vue集成飞书前端JSSDK

文章目录前言<1>飞书前端JSSDK<2>使用步骤1.将JSSDK引入到VUE2.读入数据总结 前言 公司需要使用飞书软件,所以转战飞书开发,也是对新知识的探索与研究,飞书SDK也一直都在更新,路虽远,行必达。 <1>飞书前端JSSDK 1、官网地址:https://open.feishu.cn/document/uYjL24iN/uITO4IjLykDOy4iM5gjM 2、当前使用的飞书前端JSSDk的版本:1.5.4 <!-- 在html文档中 --&gt

A 1万+

Win11+Ubuntu18.04+Ubuntu20.04三系统安装与卸载

以下情况均为个人情况:1.插入启动 U 盘后,登录时可以按F12(拯救者Y7000,不同电脑不同)进入BIOS,选择从启动盘启动。2.。3.5.在win基础上,安装第一个Ubuntu系统后,系统启动界面类似如下第一张图,Ubuntu不显示版本号。安装第二个Ubuntu系统后,系统启动界面如下第二张图,如果想更改启动项的名称,可自行查阅相关资料。

weixin_61686291的博客 2536

C++ 生产者-消费者模式详细解析与代码实现

生产者-消费者模式是一种通过缓冲区将生产者和消费者解耦的设计模式。生产者线程负责生成数据,而消费者线程负责消费数据。由于生产者和消费者的工作速度可能不同,因此缓冲区的存在使得它们可以独立运行。生产者-消费者模式是一种常见且有效的并发编程模型。在C++中,通过std::mutex和,我们可以轻松实现这一模式来协调多线程间的工作。本篇博客详细介绍了该模式的工作原理,并通过代码示例展示了它的实现。希望对你理解并应用生产者-消费者模式有所帮助。

shuai_258的博客 7581

通过HTTP的方式克隆GitHub上的项目

通过HTTP的方式克隆GitHub上的项目 打开想要下载的项目的网页链接,点击Clone or download绿色的按钮,进行如下步骤实现通过HTP的方式下载项目。 点击红色框圈出的位置: 打开想要存放项目的文件夹,在空白处点击鼠标右键,选择Git Bash Here,打开命令行。 输入git clone 复制的下载地址,回车进行下载。 4.正在下载的界面 5.下载完成。 技多不压身 哦耶✌✌✌ ...

weixin_37826412的博客 3201

用C++实现生产者-消费者问题模型

用C++来实现生产者与消费者的模型,同时稍微讲解一点可能要讲解的地方。

qq_35160090的博客 1万+

使用Anaconda和conda快速搭建YOLO开发环境

本文详细介绍了如何使用Anaconda和conda为YOLO目标检测项目快速搭建独立、纯净的开发环境。通过创建虚拟环境,有效解决了Python包版本冲突和CUDA兼容性问题,并指导安装GPU版PyTorch等核心依赖,最后通过验证脚本确保环境配置成功,为YOLO开发提供了稳定可靠的基础。

weixin_28829629的博客 161

教程: 将 SolidWorks 设计导出为 ROS 的 URDF

请按照以下步骤应用自定义徽标纹理:创建徽标材质文件:techniquepass材质名称:测试/材质颜色属性:环境、漫反射、镜面和发射都设置为白色(1 1 1 1),这意味着该材质看起来完全是白色的。纹理 在表面应用纹理图像 logo.png。将材质文件复制到 gazebo matrial:复制徽标图像:将 “徽标 ”替换为机器人上徽标所在位置的适当参考值。按照以上步骤,您就可以在 Gazebo 中为机器人添加自定义材质和纹理,包括徽标。

机器人控制与仿真应用 2457

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

生产者-消费者模型是并发编程的基础模式,通过分离数据生产和处理逻辑,提高系统吞吐量和可维护性。合理选择缓冲区类型和同步机制是实现高效、线程安全的关键。在实际应用中,需根据场景特点(如性能需求、数据量)调整实现方式。生产者-消费者模型(Producer-Consumer Model)是一种经典的并发编程模式,用于解决多线程或多进程环境下的数据共享和任务协作问题。

qq_40904479的博客 1182

YOLOv11改进 | 检测头篇 | 利用动态蛇形卷积DySnakeConv改进yolov11分割检测头(全网独家首发,Segment)

本文给大家带来的最新改进机制是一种我进行优化的专用于分割的检测头,在分割的过程中,最困难的无非就是边缘的检测,动态蛇形卷积(Dynamic Snake Convolution)通过自适应地聚焦于细长和迂回的局部结构,准确地捕捉管状结构的特征。这种卷积方法的核心思想是,通过动态形状的卷积核来增强感知能力,针对管状结构的特征提取进行优化,所以将这个卷积针对于YOLOv11的分割头进行融合是非常合适的,当然本文的检测头也支持用于目标检测,但是我将其设计出来是主要为了分割的读者使用的。

Snu77的博客 3429

生产者与消费者之间的线程通信案例

Object提供了三个方法wait(), notify(), notifyAll()在线程之间进行通信,以此来解决线程间执行顺序等问题。 wait():释放当前线程的同步监视控制器,并让当前线程进入阻塞状态,直到别的线程发出notify将该线程唤醒。 notify():唤醒在等待控制监视器的其中一个线程(随机)。只有当前线程释放了同步监视器锁(调用wait)之后,被唤醒的线程才有机会执行。 no...

a805814077的博客 663

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

生产者与消费者线程之间的通信

题目:生产者(Productor)将产品交给店员(Clerk),而消费者(Customer)从店员处 取走产品,店员一次只能持有固定数量的产品(比如:20),如果生产者试图 生产更多的产品,店员会叫生产者停一下,如果店中有空位放产品了再通 知生产者继续生产;如果店中没有产品了,店员会告诉消费者等一下,如 果店中有产品了再通知消费者来取走产品。 首先考虑:是否是多线程问题?当然是,并且有哪些线程呢?生产者线程,消费者线程 (这里的线程不止一个); 考虑是否存在有线程安全问题?线程安全首先考虑是否有共享数

qq_56457318的博客 597

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

java线程间通信[实现不同线程之间的消息传递(通信),生产者和消费者模型]

谢谢,待续!

学习笔记 5064

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

生产者和消费者之间的线程通信

线程通信: 生产者和消费者之间的关系前面几期已经跟大家讲了,不懂生产者和消费者之间的关系可以去看我之前的文章,今天主要讲他们之间的线程通信 线程通信就是线程之间可以交流,你告诉我要干什么,我告诉你要干什么,有两个很重要的方法notify()和wait(),顾名思义一个通知,一个等待 那么为什么要线程通信呢,既然他们两个是互不影响的,因为可能出现逻辑错误,比如说生产者在生产者的时候,此时消费者应该在等待,不能够去消费,比如说你去买面包,但是此时第一批已经卖完了,此时你是不可以消费的,所以说如果你还在消费

DYFNB的博客 259

单个生产者Producer、消费者Consumer之间的线程通信

本篇博文介绍的是多线程中线程间通信入门的实例。 使用线程P表示消费数据线程,使用线程C表示生产数据线程。如果程序开始时,线程C抢到了CPU执行权,发现isProduce为false即没有数据供其消费,便调用Lock.wait(),使得C线程进入了锁对象LOCK的线程等待池中(注意:wait()方法是会释放锁对象的);此时P线程抢到了CPU执行权,发现isProduce为false,就会去生产数据...

yyhwy的博客 493

多线程之间的通信-生产者消费者-中断一个线程

上一节 - 多线程安全 一. 多线程之间如何实现通讯 1.1 什么是多线程之间的通讯 多线程之间通信,其实就是多个线程在操作同一个资源,但是操作的动作不同。 1.2 多线程之间通讯需求 需求:第一个线程写入(input)用户,另一个线程读取(out)用户,实现读一个,写一个操作。 生产者消费者 **涉及到 wait 、 notify ** 共享资源源实体类: class Person{ p...

weixin_43580746的博客 203

java 线程之间的通信-生产者消费者问题

线程间的通信 线程间通信又称为进程内通信,多个线程实现互斥访问共享资源时会互相发送信号或等待信号,比如线程等待数据到来的通知,线程收到变量改变的信号等。 1 单线程间通信 1.1 初识 wait 和 notify 假设我们现在需要两个线程,一个负责生产数据,一个负责消费数据,理想状态下我们希望一边生产一边消费。 public class ProduceConsumerVersion { private final Object LOCK = new Object(); private int

wjf_jone的博客 284

Python-生产者与消费者:两个线程之间的通信

生产者与消费者:两个线程之间的通信 Python的queue提供了同步的、线程安全的队列类,包括FIFO(先入先出)队列Queue,LIFO(后进先出)队列LifoQueue,和优先级队列PriorityQueue。这些队列都实现了锁原理(可以理解为原子操作,即要么不做,要么就做完),能够在多线程中直接使用。 可以用队列来实现线程间的同步。 代码实现 import threading imp...

二进制杯莫停的博客 480

线程之间通信之消费者生产者问题

    多线程在java开发中是非常重要的一环,因为它充分利用了CPU的特性,尤其现在多核CPU的发展。很多时候能大大的提高性能,像tomcat服务器就利用了多线程,这才有并发问题。   线程共有五个状态:新生、就绪、运行、阻塞、死亡  其中需要注意一点的是:同步块中如果线程sleep了,是不会释放锁的,这个也是我们下面要谈的线程之间通信利用wait和Notify 的不同之处。 线程之间通信,首先...

远方的少年 280

线程之间通信之生产者消费者阻塞队列版

package com.itjava.interview; import java.util.concurrent.ArrayBlockingQueue; import java.util.concurrent.BlockingQueue; import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.Atom...

qq_40577921的博客 190

Day20:线程之间的通信-----生产者消费者

案例一:有两个线程,一个生产者线程,一个消费者线程 假设有一个产品类(实体类),我们通过生产者线程对其值(属性)进行设置,通过消费者线程再读取其设置的值。 要达到的最终效果是:每次生产一个,消费一个。 分五步来实现: 第一步,两个线程正确操作同一个数据源 第二步,采用循环实现数据的交替变化(数据在两个产品之间切换),来更明显发现上述程序存在的问题(把潜在问题放大化) 第三步,采用同步机...

亲爱的瑶的博客 200

六、线程之间的通信【生产者和消费者设计模式】

1、概念 它描述的是有一块缓冲区作为仓库,生产者可以将生产好的产品放入仓库,消费者可以从仓库中取走产品并消费,仓库其实是一个临界资源,生产者和消费者其实就是线程,处理这个问题的核心:保证仓库中数据的安全性【线程之间的同步,在任意时刻都只有一个线程访问仓库】 2.实现 wait():当缓冲区已满或者为空时,生产者或者消费线程将停止自己的执行,放弃锁,使得自己处于等待状态,让其他的线程...

dede19911205的博客 109

线程安全的解决方法、线程之间的通信(生产者和消费者的经典例题)

目录 解决线程安全的方式一:同步代码块 解决线程安全的方式二:同步方法 总结: 使用同步机制将单例模式中的懒汉式改为线程安全的 解决线程安全的方式三:Lock锁 线程通信的例子:使用两个线程打印1-100。线程1,线程2交替打印 线程通信的应用:经典例题:生产者和消费者的问题 一、解决线程安全的方式一:同步代码块 synchronized(同步监视器){ //需要被同步的代码 } 说明:1.操作共享数据的代码即为需要被同步的代码 2.共享数据:多个线程共.

m0_61454947的博客 2307
上一篇: Java线程并发及同步锁synchronized的应用
下一篇: Java中IO流之序列化和反序列化
madi_Goly
博客等级 码龄16年 11粉丝 14原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值