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

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

阻塞队列

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

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

特性:

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)

第一步:

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

第二步:

我们创建使用的方法

第三步:

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

http://www.xdnf.cn/news/428.html

相关文章:

  • LeetCode(Hot.2)—— 49.字符异位词分组题解
  • ARINC818-实现
  • ueditorplus编辑器已增加AI智能
  • UI键盘操作
  • 计算机网络期中复习笔记(自用)
  • 【技术派后端篇】 Redis 实现用户活跃度排行榜
  • 【UniApp】Vue2 scss 预编译器默认已由 node-sass 更换为 dart-sass
  • 如何优雅地为 Axios 配置失败重试与最大尝试次数
  • PG,TRPO,PPO,GRPO,DPO原理梳理
  • Windows桌面图标变白的解决方案
  • 不连续数据区间天数累计sql
  • Python制作简易PDF查看工具PDFViewerV1.0显示优化
  • HTML5+CSS3小实例:CSS立方体
  • 【Lua语言】Lua语言快速入门
  • redis和lua为什么能实现事务
  • 在STM32的定时器外设中,选择使用哪个外部时钟配置函数
  • 猫咪如厕检测与分类识别系统系列【十二】猫咪进出事件逻辑及日志优化
  • 【sylar-webserver】8 HOOK模块
  • Linux-进度条小程序
  • 【笔记】网路安全管理-实操
  • FiftyOne 管理数据
  • React-useRef
  • 实现Azure Data Factory安全地请求企业内部API返回数据
  • 图灵奖得主LeCun:DeepSeek开源在产品层是一种竞争,但在基础方法层更像是一种合作;新一代AI将情感化
  • Ubuntu20.04下Docker方案实现多平台SDK编译
  • 国网B接口协议图像数据上报通知接口流程详解以及上报失败原因(电网B接口)
  • 【LeetCode 热题 100】双指针 系列
  • 【leetcode100】分割等和子集
  • systemctl管理指令
  • 为什么信号完整性对于高速连接器设计至关重要?