LinkedBlockingQueue 实现 生产者 消费者

Java 多线程5——阻塞式队列BlockingQueue的原理 + 消费者生产者模型 + 代码模拟实现 这篇文章教会你如何使用这个多线程中超级无敌好用的数据结构,带你认识消费者生产者模型,并带你手动用代码实现一个阻塞式队列!! 阅读详情

Java中使用LinkedBlockingQueue实现生产者,消费者模式

LinkedBlockingQueue实现是线程安全的,实现了FIFO(先进先出)等特性. 是作为生产者消费者的首选,LinkedBlockingQueue 可以指定容量,也可以不指定,不指定的话,默认最大是Integer.MAX_VALUE,其中主要用到put和take方法,put方法在队列满的时候会阻塞直到有队列成员被消费,take方法在队列空的时候会阻塞,直到有队列成员被放进来。

生产者实现

[java]  view plain  copy
  1. package cn.hpc.producerConsumer;  
  2.   
  3. import java.util.UUID;  
  4. import java.util.concurrent.BlockingQueue;  
  5.   
  6. public class Producer implements Runnable {  
  7.     private BlockingQueue<String> queue;  
  8.     private String produce;  
  9.     public Producer(BlockingQueue<String> queue, String produce) {  
  10.         this.queue = queue;  
  11.         if (null != produce)  
  12.             this.produce = produce;  
  13.         else this.produce = "null ";  
  14.     }  
  15.   
  16.     @Override  
  17.     public void run() {  
  18.         String uuid = UUID.randomUUID().toString();  
  19.         try {  
  20.             Thread.sleep(200);//生产需要时间  
  21.             queue.put(produce + " : " + uuid);  
  22.             System.out.println("Produce \"" + produce + "\" : " + uuid + " " + Thread.currentThread());  
  23.               
  24.         } catch (InterruptedException e) {  
  25.             System.out.println(e.getMessage());  
  26.         }  
  27.     }  
  28. }         

消费者


[java] view plain copy

  1. package cn.hpc.producerConsumer;  
  2. import java.util.concurrent.BlockingQueue;    
  3. public class Consumer implements Runnable {  
  4.     private BlockingQueue<String> queue;  
  5.     private String consumer;    
  6.     public Consumer(BlockingQueue<String> queue, String consumer) {  
  7.         this.queue = queue;  
  8.         if (null != consumer)  
  9.             this.consumer = consumer;  
  10.         else  
  11.             this.consumer = "null ";  
  12.     }  
  13.   
  14.     @Override  
  15.     public void run() {  
  16.         try {  
  17.             String uuid = queue.take();  
  18.             System.out.println(consumer + " decayed " + uuid  
  19.                     + " " + Thread.currentThread());  
  20.         } catch (InterruptedException e) {  
  21.             System.out.println(e.getMessage());  
  22.         }  
  23.     }  
  24. }  

调用 :  new Tester();

[java]  view plain  copy
  1. package cn.hpc.producerConsumer;  
  2. import java.util.concurrent.ExecutorService;  
  3. import java.util.concurrent.Executors;  
  4. import java.util.concurrent.LinkedBlockingQueue;  
  5.   
  6. public class Tester {  
  7.   
  8.     public Tester(){  
  9.         // 队列  
  10.         LinkedBlockingQueue<String> queue = new LinkedBlockingQueue<String>(10); 
  11.         ExecutorService service = Executors.newCachedThreadPool();  
  12.         for (int i = 0; i < 6; i++) {  
  13.             service.submit(new Consumer(queue, "X二代" + i));  
  14.             service.submit(new Consumer(queue, "导演" + i));  
  15.         }  
  16.         for (int i = 0; i < 6; i++) {  
  17.             service.submit(new Producer(queue, "黄金酒," + i));  
  18.             service.submit(new Producer(queue, "美女演员" + i));  
  19.         }  
  20.         service.shutdown();  
  21.     }  
  22. }      

看看输出日志 n copy

  1. 12-26 12:13:07.689: I/System.out(19372): Produce "黄金酒0" : 67cbb3c8-b72b-4bd5-9edc-f1c3314e9f50 Thread[pool-1-thread-13,5,main]  
  2. 12-26 12:13:07.699: I/System.out(19372): 导演4 decayed 美女演员4 : 73e6939e-287e-4dda-88ff-2a59871f8a41 Thread[pool-1-thread-10,5,main]  
  3. 12-26 12:13:07.699: I/System.out(19372): Produce "黄金酒1" : 21f150e3-7909-47c3-a5b1-31b4f4242446 Thread[pool-1-thread-15,5,main]  
  4. 12-26 12:13:07.699: I/System.out(19372): X二代5 decayed 黄金酒5 : 66d5449b-ad38-41fe-8012-224b0f996697 Thread[pool-1-thread-11,5,main]  
  5. 12-26 12:13:07.699: I/System.out(19372): Produce "黄金酒5" : 66d5449b-ad38-41fe-8012-224b0f996697 Thread[pool-1-thread-23,5,main]  
  6. 12-26 12:13:07.699: I/System.out(19372): 导演5 decayed 美女演员5 : d6008dee-c42f-4c09-8856-ae38ac64e104 Thread[pool-1-thread-12,5,main]  
  7. 12-26 12:13:07.699: I/System.out(19372): Produce "美女演员1" : 9786647d-c499-40be-9905-da767ae2fe88 Thread[pool-1-thread-16,5,main]  
  8. 12-26 12:13:07.699: I/System.out(19372): Produce "美女演员3" : 72fcbcec-c903-4310-886a-40e31c693248 Thread[pool-1-thread-20,5,main]  
  9. 12-26 12:13:07.699: I/System.out(19372): X二代2 decayed 黄金酒2 : 75f1952c-975d-41b1-ba69-9e24006031cd Thread[pool-1-thread-5,5,main]  
  10. 12-26 12:13:07.699: I/System.out(19372): 导演2 decayed 美女演员2 : adb8b376-83c4-487b-9af1-11c16d060ee4 Thread[pool-1-thread-6,5,main]  
  11. 12-26 12:13:07.699: I/System.out(19372): 导演3 decayed 美女演员3 : 72fcbcec-c903-4310-886a-40e31c693248 Thread[pool-1-thread-8,5,main]  
  12. 12-26 12:13:07.699: I/System.out(19372): Produce "黄金酒2" : 75f1952c-975d-41b1-ba69-9e24006031cd Thread[pool-1-thread-17,5,main]  
  13. 12-26 12:13:07.699: I/System.out(19372): Produce "美女演员0" : aad2007e-6322-43bc-a1f3-ade9af671e7b Thread[pool-1-thread-14,5,main]  
  14. 12-26 12:13:07.699: I/System.out(19372): X二代0 decayed 黄金酒0 : 67cbb3c8-b72b-4bd5-9edc-f1c3314e9f50 Thread[pool-1-thread-1,5,main]  
  15. 12-26 12:13:07.699: I/System.out(19372): 导演0 decayed 美女演员0 : aad2007e-6322-43bc-a1f3-ade9af671e7b Thread[pool-1-thread-2,5,main]  
  16. 12-26 12:13:07.699: I/System.out(19372): X二代1 decayed 黄金酒1 : 21f150e3-7909-47c3-a5b1-31b4f4242446 Thread[pool-1-thread-3,5,main]  
  17. 12-26 12:13:07.699: I/System.out(19372): 导演1 decayed 美女演员1 : 9786647d-c499-40be-9905-da767ae2fe88 Thread[pool-1-thread-4,5,main]  
  18. 12-26 12:13:07.699: I/System.out(19372): Produce "黄金酒3" : c0ff371e-473d-4af0-90a7-620fa67c22d8 Thread[pool-1-thread-19,5,main]  
  19. 12-26 12:13:07.699: I/System.out(19372): Produce "美女演员5" : d6008dee-c42f-4c09-8856-ae38ac64e104 Thread[pool-1-thread-24,5,main]  
  20. 12-26 12:13:07.699: I/System.out(19372): Produce "黄金酒4" : 272cb2a6-b1dd-44d8-8254-df4f6be59bd2 Thread[pool-1-thread-21,5,main]  
  21. 12-26 12:13:07.699: I/System.out(19372): Produce "美女演员2" : adb8b376-83c4-487b-9af1-11c16d060ee4 Thread[pool-1-thread-18,5,main]  
  22. 12-26 12:13:07.699: I/System.out(19372): Produce "美女演员4" : 73e6939e-287e-4dda-88ff-2a59871f8a41 Thread[pool-1-thread-22,5,main]  
  23. 12-26 12:13:07.699: I/System.out(19372): X二代3 decayed 黄金酒3 : c0ff371e-473d-4af0-90a7-620fa67c22d8 Thread[pool-1-thread-7,5,main]  
  24. 12-26 12:13:07.699: I/System.out(19372): X二代4 decayed 黄金酒4 : 272cb2a6-b1dd-44d8-8254-df4f6be59bd2 Thread[pool-1-thread-9,5,main]  

基于LinkedBlockingQueue来实现生产者和消费者模型Demo       生产者消费者问题是多线程的一个经典问题,它描述是有一块缓冲区作为仓库,生产者可以将产品放入仓库,消费者则可以从仓库中取走产品。 解决生产者/消费者问题的方法可分为两类: 采用某种机制保护生产者和消费者之间的同步; 在生产者和消费者之间建立一个管道。 第一种方式有较高的效率,并且易于实现,代码的可控制性较好,属于常用的模式。第二种管道缓冲区不易控制,被传输数据对象不易于封装等,实用... 阅读详情

相关推荐

模拟版图里的“设计思维”:如何用Guard Ring和布局优化平衡面积、性能与成本

本文深入探讨了模拟版图设计中的设计思维,重点分析了Guard Ring和布局优化在平衡面积、性能与成本方面的关键作用。通过实战案例和技巧分享,展示了如何在PDK规则框架内实现创新设计,提升芯片性能的同时控制成本。文章特别强调了设计思维在版图优化中的系统应用,为工程师提供了宝贵的实践指导。

weixin_33726313的博客 392

Java LinkedBlockingQueue实现消息队列

最近有个项目需要开发一个预约系统,系统涉及到发送短信验证码;一般用户点击发送验证码,发送请求到后端后,调用短信接口,成功后就返回响应的状态码给用户;但是这样的过程,有时候会因为短信接口响应慢,而导致前端响应慢;所以这里需要做一个简单的优化,当用户点击发送短信时,将我们的短信调用放入一个队列中,放入之后,即给前端响应;后面通过阻塞队列,取出队列内容,进行短信发送即可,这样可以更好的提升系统的性能和用户体验度; 一、创建短信生产者 public class MessageProducer implements

猪大肠的博客 1666

东方马达步进电机AZM66AK-HS100+AZD-KD调试经验记录

东方马达步进电机AZM66AK-HS100+AZD-KD调试经验记录(20170803YC) 本次总结主要实现的功能如下:用MEXE02软件在步进电机驱动器中设置好控制动作,每个控制动作有一个特定的编号。之后通过PC和驱动器之间的485通讯,发送相关指令,使步进电机按照一定编号的控制动作运转。 参考资料:东方马达步进电机AZM66AK-HS100+AZD-KD的产品手册,可在官网下载。 A....

dahailuoa6的博客 1万+

基于LinkedBlockingQueue实现消费者模型

业务背景 1、服务端接收客户端路径规划命令,服务端执行路径规划,下发规划结果给客户端。 2、客户端能够发送取消路径规划命令,取消掉未执行的规划请求,如果已经执行则下发取消命令给目标客户端。 3、目前服务端路径规划服务只能单线程顺序执行,考虑使用阻塞队列实现此功能。 模拟代码 import cn.hutool.core.thread.ThreadUtil; import lombok.AllArgsConstructor; import lombok.Data; import java.util

cyy298的博客 477

Docker+vLLM内网离线部署Qwen3 流程

本文介绍了在CentOS 7系统下进行VLLM容器化部署Qwen3-32B大模型的内网离线方案。首先需准备Nvidia显卡驱动、CUDA 12.4和Docker环境。通过联网机器拉取vllm/vllm-openai镜像并导入内网服务器,同时从魔塔社区下载模型文件。部署时使用docker run命令启动容器,配置了GPU资源、内存共享、端口映射等参数,特别指定了模型路径、并行计算、内存利用率等关键参数。该方案实现了大模型在内网环境的安全高效部署,适用于需要离线运行的AI推理场景。

qq_42881308的博客 1036

利用Python暴力破解邻居家WiFi密码

如觉得博主文章写的不错或对你有所帮助的话,还望大家多多支持呀!

weixin_45841831的博客 6万+

java使用LinkedBlockingQueue实现 生产者 消费者模式

LinkedBlockingQueue LinkedBlockingQueue实现是线程安全的,实现了FIFO(先进先出)等特性. 是作为生产者消费者的首选,LinkedBlockingQueue 可以指定容量,也可以不指定,不指定的话,默认最大是Integer.MAX_VALUE,其中主要用到put和take方法,put方法在队列满的时候会阻塞直到有队列成员被消费,take方法在队列空的时

韩鹏程的专栏 9850

大模型系统构建的“三驾马车”——Prompt、Context与Harness工程

在LLM应用开发的早期阶段,我们热衷于比拼“提示词”的精妙程度。那时,一个精心构造的思维链CoT就能让模型的表现提升10%以上。随着大模型从“玩具”走向“生产系统”,我们逐渐意识到:单一的 Prompt 只是起点,而非终点。 真正的工业级应用,需要构建一套三层递进的工程体系——Prompt Engineering、Context Engineering 和 Harness Engineering。

西木风落 604

使用LinkedBlockingQueue来实现生产者消费者的例子

工作中,经常有将文件中的数据导入数据库的表中,或者将数据库表中的记录保存到文件中。为了提高程序的处理速度,可以设置读线程和写线程,这些线程通过消息队列进行数据交互。本例就是使用了LinkedBlockingQueue来模仿生产者线程和消费者线程进行数据生产和消费。 为了方便,这些不同的类被写在了一个类中,实际使用的时候,可以单独拆开,举一反三地使用。 以下是例子: LinkedBlockingQ...

hawanglc的博客 1475

永磁同步电机矢量控制——电流内环前馈解耦策略

在采用永磁同步电机矢量控制时,ud和uq的指令值存在耦合项。需要对其进行解耦,目前,常用的解耦设计方法有前馈解耦、偏差解耦以及内模控制,本文主要分享电流内环前馈解耦控制策略。

a12312341ll的博客 8691

单细胞转录组分析(scRNA-seq)

单细胞转录组测序(Single-cell RNA sequencing,scRNA-seq)是一种高通量测序技术,可以在单细胞水平解析基因表达情况,揭示细胞异质性,探索稀有细胞类型,并研究细胞状态转换及动态调控机制。与传统的。

大甘的博客 6148

LinkedBlockingQueue实现生产者-消费者模式

由于LinkedBlockingQueue 实现是线程安全的,实现了先进先出等特性,是作为生产者消费者的首选,LinkedBlockingQueue 可以指定容量,也可以不指定,不指定的话,默认最大是Integer.MAX_VALUE,其中主要用到put和take方法,put方法在队列满的时候会阻塞直到有队列成员被消费,take方法在队列空的时候会阻塞,直到有队列成员被放进来。   Ja

mingyunduoshou的专栏 2023

杰理可视化SDK开发-杰理AC1123N芯片SDK开发笔记合集

该文档主要描述 AC112N开发相关的使用说明和注意事项,收集并持续更新开发调试过程中的相关疑问和解答,对SDK介绍文档做一个补充说明。写作人:李永奉,参考项目MD-026H; AC112N-SDK项目帮助文档在杰理开发者平台(JL DP)'帮助'处进入,如本文档有与后续帮助文档或工具注释说明冲突,以后者为标准。

李永奉的博客 180

利用LinkedBlockingQueue实现生产者-消费者模式

由于LinkedBlockingQueue 实现是线程安全的,实现了先进先出等特性,是作为生产者消费者的首选,LinkedBlockingQueue 可以指定容量,也可以不指定,不指定的话,默认最大是Integer.MAX_VALUE,其中主要用到put和take方法,put方法在队列满的时候会阻塞直到有队列成员被消费,take方法在队列空的时候会阻塞,直到有队列成员被放进来。下面是一个例子,一看

Shawn 752

PostgreSQL 实战:行级安全策略(RLS)详解

PostgreSQL的行级安全(RLS)机制实现了细粒度的数据访问控制,通过动态过滤行数据满足多租户隔离、隐私保护等需求。本文系统介绍了RLS的核心原理、配置方法及实践建议:1) 启用RLS后需定义策略,通过USING和WITH CHECK条件控制访问;2) 适用于SaaS、医疗金融等场景,但需注意COPY命令、外键等特殊情况;3) 建议配合会话变量、索引优化和文档化策略使用。文章还提供了多租户隔离等实战案例,并分析了RLS对查询性能的影响及优化方案。RLS将安全控制下沉至数据库层,显著提升应用安全性和可维

数据知道的博客 3149

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

LinkedBlockingQueue 实现生产者消费者模型

LinkedBlockingQueue是一个基于已链接节点的、范围任意的blocking queue的实现。      此队列按 FIFO(先进先出)排序元素。队列的头部 是在队列中时间最长的元素。队列的尾部 是在队列中时间最短的元素。      新元素插入到队列的尾部,并且队列检索操作会获得位于队列头部的元素。链接队列的吞吐量通常要高于基于数组的队列,      但是在大多数并发应用程

2.wa 3023

IMSL CNL 7.0.0 (x86-64)Crack

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

用阻塞队列LinkedBlockingQueue实现生产者消费者先进先出

在Java多线程应用中,队列的使用率很高,多数生产消费模型的首选数据结构就是队列(先进先出)。Java提供的线程安全的Queue可以分为阻塞队列和非阻塞队列,其中阻塞队列的典型例子是BlockingQueue,非阻塞队列的典型例子是ConcurrentLinkedQueue,在实际应用中要根据实际需要选用阻塞队列或者非阻塞队列。 注:什么叫线程安全?这个首先要明确。线程安全就是说多线程访问同一代码,不会产生不确定的结果。 并行和并发区别 1、并行是指两者同时执行一件事,比如赛跑,两个人都在不停的往前跑; 2

done58的专栏 9919

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

读LinkedBlockingQueue源码并实现生产者、消费者模式

在日常开发中,我们经常会遇到在高并发的情况下,对于瞬间产生的大量数据来不及处理,这时候该怎么办?总不能数据还没处理就把数据丢弃,那我们该把这些数据存储在哪呢?简单的数组或者util包下的集合类型是不能满足在这种并发情况下存储数据要求的。这时候就得我们自己定义这么一种队列,它能在多线程环境下,当本身没有存储数据或者存满数据的情况下,能够让相应线程阻塞,一旦上面的条件不成立时,可以立马唤醒相应线程去存

知其然,必将知其所以然 550

java消费者生产者模式及JDK之阻塞队列LinkedBlockingQueue实现

生产者消费者问题    (英语:Producer-consumer problem),也称有限缓冲问题(英语:Bounded-buffer problem),是一个多线程同步问题的经典案例。该问题描述了两个共享固定大小缓冲区的线程——即所谓的“生产者”和“消费者”——在实际运行时会发生的问题。生产者的主要作用是生成一定量的数据放到缓冲区中,然后重复此过程。与此同时,消费者也在缓冲区消耗这

业精于勤,荒于嬉;行成于思,毁于随。 2538

多线程——使用阻塞列队LinkedBlockingQueue<E>实现生产者消费者程序。

【代码】多线程——使用阻塞列队LinkedBlockingQueue<E>实现生产者消费者程序。

wsqygg的博客 324

用阻塞队列ArrayBlockingQueue或LinkedBlockingQueue实现实现生产者与消费者

 [代码] ArrayBlockingQueue或LinkedBlockingQueue ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 3

yfyk101的博客 417

三种方式实现生产者消费者模式:synchronized+wait+notify,lock+condition,LinkedBlockingQueue

synchronized+wait+notify,方法比较低级 关键在于:put和get方法必须是synchronized修饰的,并且容器为空的时候不能get,容器满了的时候,不能put。 public class Container<T> { List<T> list=new LinkedList<>(); int max=10; sy...

weixin_44893585的博客 365
上一篇: 推荐:微信红包的架构设计简介
下一篇: 什么是分布式系统
大树叶
博客等级 码龄12年 1171粉丝 664原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值