当前位置: 首页 > news >正文

多线程——阻塞队列(六)

阻塞队列

阻塞队列是一种特殊的队列. 也遵守 "先进先出" 的原则

阻塞队列是线程安全的,并且有两个特性:

特性:

1、当队列满的时候, 继续入队列就会阻塞, 直到有其他线程从队列中取走元素.

2、当队列空的时候, 继续出队列也会阻塞, 直到有其他线程往队列中插入元素.

阻塞队列的一个典型应用场景就是 "生产者消费者模型". 这是一种非常典型的开发模型.

优点:

1、有解耦合的作用。

2、削峰填谷。(就相当于一个缓冲区,可以用阻塞队列来限制突然多或者少的情况,不至于导致服务器挂掉)

缺点:

1、上述阻塞队列,并非是简单的数据结构,而是基于这个数据结构的实现的服务器维护,又被部署到单独的主机上。

2、整个系统的结构更复杂了,维护的服务器更多了。

3、效率低了。

生产者消费者模型:

1生产者消费者模式就是通过一个容器来解决生产者和消费者的强耦合问题。

2、阻塞队列就相当于一个缓冲区,平衡了生产者和消费者的处理能力。

3、阻塞队列也能使生产者和消费者之间 解耦。

标准库中的阻塞队列——BlockingQueue

三个阻塞队列的使用

1、BlockingDeque blockingDeque = (BlockingDeque) new ArrayBlockingQueue<>(100);

这是基于数组实现,100是说当前的开的空间。

2、BlockingDeque blockingDeque1 = new LinkedBlockingDeque(100);

这是基于链表实现,100是说当前的开的空间。

3、BlockingDeque blockingDeque2 = (BlockingDeque) new PriorityBlockingQueue<>(100);

这是基于优先级实现,100是说当前的开的空间。

自带的方法:

1、put 方法用于阻塞式的入队列。

2、take 用于阻塞式的出队列

BlockingQueue 也有 offer, poll, peek 等方法, 但是这些方法不带有阻塞特性。

阻塞队列实现

这里我们就使用基于数组实现的阻塞队列来展示。

  1. 通过 "循环队列" 的方式来实现.

  2. 使用 synchronized 进行加锁控制.

  3. put 插入元素的时候, 判定如果队列满了, 就进行 wait. (注意, 要在循环中进行 wait. 被唤醒时不一定队列就不满了, 因为notify可能是唤醒了其他put的线程).

  4. take 取出元素的时候, 判定如果队列为空, 就进行 wait. (也是循环 wait)

第一步:

我们先设置我们使用的成员变量

第二步:

我们创建使用的方法

第三步:

创建实例,使用方法进行操作。

相关文章:

  • 红黑树模拟实现STL中的map和set---C++
  • 关于Redis中的事务的理解
  • 杨校老师课堂之C++入门练习题梳理
  • 日志分析---宝瓜Windows日志分析器
  • 二进制裁剪命令mips-linux-gnu-strip 命令的使用
  • [文献阅读] EnCodec - High Fidelity Neural Audio Compression
  • 日常开发记录
  • python——列表和元组
  • 【RL系列】ReTool: Reinforcement Learning for Strategic Tool Use in LLMs
  • 爬取B站视频弹幕的简易教程(下)
  • 算法--打表法
  • 每天学一个 Linux 命令(24):chattr
  • 黑马Java基础笔记-1
  • sql学习
  • word表格批量操作——宏
  • 损失函数总结
  • 从 “单细胞” 到 “数据森林”:层次聚类的 “自底向上” 生长法则
  • 【数学】勾股定理
  • 2025年渗透测试面试题总结-拷打题库05(题目+回答)
  • 修改Theme SHELL美化panel
  • 西藏艺术来到黄浦江畔,“隐秘之门”艺术展外滩三号开幕
  • 为博眼球竟编造一女孩被活埋,公安机关公布10起谣言案件
  • 美肯塔基州长警告:关税或致美家庭年增数千美元支出
  • 贵阳市消防救援支队原支队长李世永受审,为谋提拔给中管干部送25万
  • 何立峰:着力推进外贸高质量发展,共同努力建设开放型世界经济
  • 春日有滋味 | 蚕豆、春笋、喉黑鱼和活麻