使用并发队列实现生产者与消费者

使用Qt信号量实现单生产者多消费者模型 基于Qt信号量实现的单生产者多消费者模式下的消息队列,可在多线程应用中对不同的消息结构体进行数据传输。 立即下载

使用并发队列实现生产者与消费者

完全利用了阻塞队列的特性,实现了消费者生产者的关系,非常好玩!

大家赶紧看看代码,然后动手默写一个吧~~

package com.toov5.thread;

import java.util.concurrent.BlockingQueue;
import java.util.concurrent.LinkedBlockingDeque;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicInteger;

class ProducerThread implements Runnable{
      public volatile boolean FLAG = true;
      AtomicInteger atomicInteger = new AtomicInteger();  //作计数用的
      public BlockingQueue<String> blockingQueue;
      public ProducerThread(BlockingQueue<String> blockingQueue) {
         this.blockingQueue=blockingQueue;
    }
    
      @Override
    public void run() {
        System.out.println("生产者线程已启动");
        try {
            while (FLAG) {
                String  incrementAndGet = atomicInteger.incrementAndGet()+"";  //每次都安全的++ 可以这么理解  +""转为string类型    
                boolean offer =    blockingQueue.offer(incrementAndGet,2,TimeUnit.SECONDS);//如果超出了那么要等待两秒  
                if (offer) {
                    System.out.println("生产者存入队列成功:数据"+incrementAndGet);
                }else {
                    System.out.println("生产者存入队列失败:数据"+incrementAndGet);
                }    
            Thread.sleep(1000);    
            }
        } catch (Exception e) {
            // TODO: handle exception
        }finally{
            System.out.println("生产者结束......");
        }    
    }
    
    public void stop(){
        this.FLAG=false;
    }  
      
}
//消费者队列 获取队列
class ConsumerThread implements Runnable{
      public volatile boolean FLAG = true;
      AtomicInteger atomicInteger = new AtomicInteger();  //作计数用的
      public BlockingQueue<String> blockingQueue;
      public ConsumerThread(BlockingQueue<String> blockingQueue) {
        this.blockingQueue=blockingQueue;
    }
    @Override
    public void run() {
        System.out.println("消费者线程已经启动...");
    
        try {
            while (FLAG) {    
            String data = blockingQueue.poll(2, TimeUnit.SECONDS);
            if (data==null) {
                System.out.println("超过2秒时间、没有获取队列信息");
                FLAG=false;
                return;  //没有结果了 最后就推出啦
            }
            System.out.println("获取到结果data"+data);
        } 
        }catch (InterruptedException e) {
            e.printStackTrace();
        }finally{
            System.out.println("消费者停止.....");
        }
        
    }
}

public class ProducerAndConsumer {

    
    public static void main(String[] args) {
        
        LinkedBlockingDeque<String> linkedBlockingDeque = new LinkedBlockingDeque<>(8); //容量可传也可以不用 默认有个值 超过最大值要扩容
        ProducerThread producerThread = new ProducerThread(linkedBlockingDeque);
        ConsumerThread consumerThread = new ConsumerThread(linkedBlockingDeque);
        Thread p = new Thread(producerThread);
        Thread c = new Thread(consumerThread);
        p.start();
        c.start();
        try {
            //等待10s
            Thread.sleep(3000);
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
       producerThread.stop();    
    }
    
    
}

 

看到运行结果

消费者获取不到什么的话 等待等待 再获取不到就退出了

 

ROS新手必看:5分钟搞定URDF小车建模(附Rviz可视化调试技巧) 本文为ROS新手提供了快速构建URDF机器人模型的实战指南。通过一个完整的两轮差速小车建模案例,详细解析了URDF的核心语法、Rviz可视化调试技巧以及常见问题排查方法,帮助初学者快速掌握ROS机器人建模与可视化调试的核心技能。 阅读详情

相关推荐

无人机避障——4DMmvRadar三维点云坐标转换到无人机坐标系(三)

无人机避障——4DMmvRadar三维点云坐标转换到无人机坐标系(三)

weixin_45390670的博客 1869

C++实现生产者消费者队列

C++实现生产者消费者队列分析程序队列的类生产者逻辑消费者逻辑主函数结果分析源码地址 分析 首先,我们的生产者与消费者队列需要满足同步与互斥关系,就需要一把互斥锁,以及生产者与消费者各自的条件变量。 其次,我们可以利用C++中STL里的queue队列来进行实现,但是我们需要对push,pop进行修改,因为STL库的函数不一定能满足互斥条件。也就是不一定安全。 最后,所有资源在程序结束后一定要记得释...

duchenlong的博客 3053

ZYNQ Linux下UIO中断配置避坑实录:从设备树修改到用户层测试(Vivado 2018.2)

本文详细解析了ZYNQ Linux下UIO中断配置的全流程,从设备树修改到用户层测试,特别针对Vivado 2018.2环境中的常见陷阱提供解决方案。内容涵盖中断号配置规则、用户空间中断处理程序编写以及性能优化技巧,帮助开发者高效实现硬件中断的用户空间控制。

weixin_31854867的博客 333

多线程threading.Thread+队列queue实现生产者消费者

Python的Queue模块提供了同步的,线程安全的队列类,包括:FIFO队列Queue,LIFO队列LifeQueue,优先级队列PriorityQueue,这些队列都实现了锁原语,能在多线程中直接使用,可以使用队列来实现线程间的同步。 初始化Queue()对象时(如:q=Queue()),若括号中没有指定最大可接收的消息数量,或数量为负数,那么就代表可接收的消息数量没有上限。 队列的方法:(三种队列适用) def task_done(self) ......

qq_40132294的博客 2977

从零构建:ESP32S3无线DAP-Link调试器的硬件与软件协同设计

本文详细介绍了基于ESP32S3的无线DAP-Link调试器的硬件与软件协同设计,涵盖关键元器件选型、无线通信协议优化、双核任务处理及低功耗调试方案。通过ESP-NOW协议实现低延迟无线调试,结合USB协议栈与双核协同,为嵌入式开发提供高效灵活的调试解决方案。

gitlab7runner的博客 859

RTPS规范v2.3(中文版)

DDSI-RTPSv2.3,DDS发现互操作性-实时发布订阅通信协议,中文版

pony12的专栏 752

34.实现一个队列

实现一个队列,队列的应用场景为:一个生产者线程将int类型的数入列,一个消费者线程将int类型的数出列 思路一: 这就是操作系统中介绍的PV操作,队列的一个典型的应用模式。实现这个PV操作的过程中要注意两个线程之间的通信就可以了。 #include "stdafx.h" #include #include #include #include #include

雪儿的专栏 771

爬取二手房数据:Python爬虫+Geopy实战,看透房价与地理位置的隐藏关系

哪些区域单价虚高(房源少但单价远高于周边);哪些小区性价比高(靠近地铁/学校,单价低于同地段平均水平);房价与地理位置的量化关系(如距离地铁每远1公里,单价下降多少)。如果想扩展分析范围,可爬取多个城市/区域的数据,对比不同城市的房价差异;或结合时间维度(定期爬取),分析房价的涨跌趋势。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 949

Java并发编程(1)—— 实现一个生产者消费者队列(三种方式)

生产者消费者队列,顾名思义,就是一个队列,不停地有生产者在里面生产对象并通知阻塞的消费者可以消费了,如果队列满了,生产者就阻塞不能再生产;消费者来消费(也就是读取并拿走队列里的对象)并通知阻塞的生产者,直到把队列消费空,就阻塞不能再消费。 wait/notify机制 wait/notify机制原理 wait/notify机制是与Monitor监视器锁关联在一起的。一个线程在持有某个对象的监视器...

Aviato 3248

【AI智能体】最强AI编程利器 Claude Code 从部署到项目实战详解

最强AI编程利器 Claude Code 从部署到项目实战详解

congge 4511

【YOLOv11多模态涨点改进】独家创新首发 | TGRS 2025 | 引入CDFIM跨模态差异特征交互模块,通过差异特征提取和融合增强机制,减少了冗余信息,显著提升了小目标的检测精度,高效涨点改进

🔥本文给大家介绍使用 CDFIM跨模态差异特征交互模块改进 YOLOv11多模态目标检测,通过有效的差异特征提取和增强,显著提升了小目标的检测精度,特别是在复杂背景和低对比度环境下。该模块通过残差加法和通道与空间注意力机制,增强了可见光与红外模态之间的互补特征交互,减少了冗余信息,提高了检测稳定性。尽管提升了特征交互,CDFIM 仍保持轻量化设计,计算开销和参数量较低,适合实时检测应用。总的来说,CDFIM 模块在保留原始模态信息的同时优化了特征融合,有效提高了 YOLO 在多模态目标检测中的鲁棒性和精度

Ai缝合怪、助力小伙伴高效发论文 131

【面试题】实现一个队列数据结构,并使用这个队列实现一个生产者消费者模式...

一、采用链表实现队列 public class MyQueue { private class Node { public Node before; public Object data; public Node after; public Node(Node before, Object data, Node...

与优秀的人在一起,会使自己变得更优秀 849

【2024遥感应用组一等奖】基于风云四号卫星的小时级大气气溶胶和颗粒物监测

最后,比较AGRI观测反射率和查找表计算的反射率反演得到的1小时分辨率AOD数据。然后,使用广泛应用的MODIS DT和DB产品进行对比,图 5显示了它们逐像元尺度的对比,AGRI LaGA算法可以捕捉亚洲地区AOD高低值空间分布格局,比如南亚次大陆、中南半岛、塔克拉玛干沙漠和华北平原是AOD高值区域(平均AOD高于0.3),中国西北、中国南方、中国东北和韩国地区为AOD中值地区(平均AOD在0.2到0.3之间),北纬45度以上以及日本地区为AOD低值区域(平均AOD小于0.2),与全球平均AOD值接近。

JData_Engineer的博客 373

Java并发编程(11)-使用ReentrantLock与Condition实现生产者-消费者队列

Condition在Java并发编程中是一个十分常用的接口,被称为条件变量,常与显式锁和可重入锁一起使用,它可以在某些条件下使线程进行休眠或者唤醒,本文将以实现生产者-消费者模式的队列作为demo让大家对条件变量 有初步的了解。

BoringError的博客 1048

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

【多线程高并发】-Java使用阻塞队列ArrayBlockingQueue实现生产者消费者模式?

在上文中的多线程高并发中,我们已经知道一个阻塞队列的三个基本功能了: 队列的先进先出功能; 队列满时,放数据会被阻塞; 队列空时,取数据会被阻塞; 而本次用Java实现好的ArrayBlockQueue来实现生产者-消费者模式。 生产者往队列里面放东西; 消费者从队列里面取东西; package com.lcz.tencent.thread; import java.util.concurrent.ArrayBlockingQueue; // 阻塞队列实现多线程下的生产者和消费者模式 publi

Mind_programmonkey的博客 539

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

【并发编程】异步模式之生产者消费者

作为参数传递不是很方便,因此设计一个用来解耦的中间类,这样不仅能够解耦【结果等待者】和【结果生产者】,还能够同时支持多个任务的管理。之后3个postman开始送信,送到后notifyAll(),但是只能叫醒自己锁对象里阻塞的people。3个people开始收信,get()中有wait方法阻塞三个人进入waitSet,然后主线程睡了1秒。右侧的 t1,t3,t5 就好比邮递员如果需要在多个类之间使用 GuardedObject 对象,左侧的 t0,t2,t4 就好比等待邮件的居民,

m0_62645012的博客 444

[Linux]生产者消费者模型(基于BlockQueue的生产者消费者模型 | 基于环形队列的生产者消费者模型 | 信号量 )

在多线程编程中阻塞队列(Blocking Queue)是一种常用于实现生产者和消费者模型的数据结构。其与普通的队列区别在于,当队列为空时,从队列获取元素的操作将会被阻塞,直到队列中被放入了元素;当队列满时,往队列里存放元素的操作也会被阻塞,直到有元素被从队列中取出(以上的操作都是基于不同的线程来说的,线程在对阻塞队列进程操作时会被阻塞)。POSIX信号量和SystemV信号量作用相同,都是用于同步操作,达到无冲突的访问共享资源目的。但POSIX可以用于线程间同步。

weixin_53027918的博客 1827

java阻塞队列设计思想_Java设计模式—生产者消费者模式(阻塞队列实现)

生产者消费者模式是并发、多线程编程中经典的设计模式,生产者和消费者通过分离的执行工作解耦,简化了开发模式,生产者和消费者可以以不同的速度生产和消费数据。这篇文章我们来看看什么是生产者消费者模式,这个问题也是多线程面试题中经常被提及的。如何使用阻塞队列(Blocking Queue)解决生产者消费者模式,以及使用生产者消费者模式的好处。真实世界中的生产者消费者模式生产者和消费者模式在生活当中随处可见...

weixin_39542340的博客 94

Python多进程队列(Queue)和生产者消费者模型

Python中每个进程的内存是相互隔离的,那么如何实现进程之间的通信了,multiprocessing模块提供了队列和管道2种方式来实现进程之间的消息传递。队列的底层就是通过管道和锁来实现的。 队列相关的方法 from multiprocessing import Process,Queue q = Queue([maxsize]) # 创建一个队列,maxsize表示队列的大小,即可以存放几条数据,如果省略则可以存放无穷多条数据,取决于你内存空间的大小 q.put(data,block=True,t

weixin_43989215的博客 1892

BlockingQueue阻塞队列实现生产者消费者模式

package com.hangzhou.springcloud.service.impl; import com.alibaba.fastjson.JSON; import java.util.concurrent.BlockingQueue; import java.util.concurrent.LinkedBlockingQueue; import java.util.concurr...

stack优快云的博客 375

Python基础之生产者与消费者模型

简介 在并发编程中使用生产者和消费者模式能够解决绝大多数并发问题。该模式通过平衡生产线程和消费线程的工作能力来提高程序的整体处理数据的速度。 为什么要使用生产者和消费者模式 在线程世界里,生产者就是生产数据的线程,消费者就是消费数据的线程。在多线程开发当中,如果生产者处理速度很快,而消费者处理速度很慢,那么生产者就必须等待消费者处理完,才能继续生产数据。同样的道理,如果消费者的处理能力大于生...

PythonGo 9759

Python并发编程:多进程-生产者消费者模型

生产者消费者模式是通过一个容器来解决生产者和消费者的强耦合问题,生产者和消费者彼此之间不直接通讯,而通过阻塞队列来进行通讯,所以生产者生产完数据之后不用等待消费者处理,直接扔给阻塞队列,消费者不找生产者要数据,而是直接从阻塞队列里取,阻塞队列就相当于一个缓冲区,平衡了生产者和消费者的处理能力。生产者指的是生产数据的任务,消费者指的是处理数据的任务,在并发编程中,如果生产者处理速度很快,而消费者处理速度很慢,那么生产者就必须等待消费者处理完,才能继续生产数据。2、引入生产者消费者模型为了解决的问题是。

liudefang的专栏 1862

在Python网络爬虫程序中使用生产者消费者模式爬取数据

本文介绍了在python网络爬虫程序中如何使用生产者与消费者模式进行数据爬取: 1. 生产者与消费者模式 2. 队列Queue与进程间通信 3. 在Python网络爬虫程序中使用队列进行进程间通信

hubing_hust的专栏 1万+

java并发编程——异步模式之生产者/消费者

异步模式之生产者/消费者 与前面的保护性暂停中的 GuardObject 不同,不需要产生结果和消费结果的线程一一对应 消费队列可以用来平衡生产和消费的线程资源 生产者仅负责产生结果数据,不关心数据该如何处理,而消费者专心处理结果数据 消息队列是有容量限制的,满时不会再加入数据,空时不会再消耗数据 JDK 中各种阻塞队列,采用的就是这种模式 说明,t1,t2,t3是生产者,t4是消费者,这里的t4不一定是一个,有可能是多个。 实现 import lombok.extern.slf4j.Slf4j; i

mirana的专栏 623

【Linux】生产者消费者模型代码实现和信号量

下面我们实现基于阻塞队列的生产消费模型: 首先我们创建一个头文件用来放阻塞队列的类: 这个类也很简单,只需要有一个普通队列,一个记录队列容量的变量,一个互斥锁(保护共享资源的安全),一个条件变量(维护线程的互斥与同步)。类中最重要的两个接口是push和pop,然后构造和析构函数必须要有。下面进入测试文件: 在测试文件中,首先我们要有一个阻塞队列对象,然后创建两个线程,一个代表生产者一个代表消费者。然后我们创建这两个线程并且将阻塞队列传进去,这样这两个线程就能看到同一个缓冲区了。最main函数返回前记

Sxy_wspsby的博客 2077

基于单链表和基于环形队列的生产者消费者模型_c++ 生产者消费者模型环形队列

void pushFront(node_p h,int data)//向链表头部插入元素。static void free_node( node_p _n)//释放结点。void destroyList( node_p h)//销毁链表。void initList(node_pp _h)//初始化链表。

2401_84978510的博客 772
上一篇: 重排序问题
下一篇: 线程池
Art&Code
博客等级 码龄7年 77粉丝 554原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值