首页 > 编程语言 >Java ---- 阻塞队列 Blocking Queue

Java ---- 阻塞队列 Blocking Queue

时间:2024-04-25 18:23:36浏览次数:25  
标签:---- Java 队列 元素 LinkedBlockingQueue 阻塞 Queue 线程 ArrayBlockingQueue

阻塞队列(Blocking Queue)是一种特殊类型的队列,用于多线程环境中,实现进程通信;

常见的Java阻塞队列包括:

(1)ArrayBlockingQueue(有界队列)

  内部是采用数组存储元素的,初始化需要指定容器大小,ArrayBlockingQueue可以用于实现数据缓存、限流、生产者 - 消费者模式等各种应用。在队列的基础上,提供了阻塞添加获取元素的能力;循环数组,双指针的形式;插入和删除的时间复杂度都是O(1);

  原理:

  1)采用Lock锁的Condition通知机制来进行阻塞控制的;

  2)利用独占锁 ReentrantLock 实现线程安全;

(2)LinkedBlockingQueue(无界队列)

  采用基于链表实现的阻塞队列;默认情况下,阻塞队列的大小,数值特别大,所以被称为无界的队列;内部是由单向链表实现的,采用锁分离技术实现入队出队互不阻塞。添加元素和获取元素都有独立的锁;

  QS:线程池中为什么使用LinkedBlockingQueue而不用ArrayBlockingQueue?
  因为LinkedBlockingQueue的入队和出队是两把锁,存取元素互不干扰。ArrayBlockingQueue则是使用的同一把锁,存取元素时相互排斥。LinkedBlockingQueue这种锁分离的方式可以有效地减少锁竞争,从而提高线程池的并发性能。

(3)PriorityBlockingQueue(FIFO队列)

阻塞队列的特点:

(1)当队列为空时,从队列中获取元素的操作会被阻塞;直到队列中,有新的元素可用;

(2)当队列已满时,向队列中添加元素的操作会被阻塞,直到队列中有空位置可以用,

 常见应用场景:

(1)生产者消费者模型;

(2)线程池的任务队列;

(3)同步队列;多个线程同步一个元素;

标签:----,Java,队列,元素,LinkedBlockingQueue,阻塞,Queue,线程,ArrayBlockingQueue
From: https://www.cnblogs.com/kuangmeng/p/18158279

相关文章

  • 【CC2DX随笔】多个精灵播放同一个动画时的问题(只播放最后一个动画)
    多个精灵播放同一个动画时的问题代码摘要//pSpReinit在2次循环里代表2个精灵.for(shortj=0;j<2;j++){for(shorti=0;i<THMAX_ANI_COUNT;i++){if(0==strcmp(m_arrpAniGroup[i]->szarrDesc,"batMove")){pAniMoveTo=m_arrpAni......
  • JMeter定时器(一)
    一前言环境:window10JMeter5.3二定时器定时器(Timers)的作用就是对取样器(sampler)的执行进行延迟,所以,定时器只对同作用域的取样器有意义定时器会在其所处作用域内的取样器之前执行。把定时器添加为取样器的子节点,这样就会在取样器之前执行1固定定时器这个比较简单,延迟时......
  • [题解] [NOIP2011 提高组] Mayan 游戏
    [题解][NOIP2011提高组]Mayan游戏题目描述有一个\(7\)行\(5\)列的格子棋盘,有的格子上有方块。方块有重力,即如果一个方块下面没有其他方块,他就会往下掉,直到触底或者下面有方块为止。每个方块都有自己的颜色,如果连着三个竖着或者横着的方块颜色相同,它们就会消除。如果出......
  • 敏捷产品经理实训 / 敏捷产品负责人实训
    ​课程简介优秀的产品通常包括以下三个特征:第一:能够抓住用户痛点,帮助用户解决问题;第二:容易使用,极致的用户体验;第三:质量好、性能稳定。这是一个两天的面向产品经理的实训课程,课程旨在帮助学员掌握按照敏捷和互联网思维进行产品研发,打造用户喜爱的产品的思路及实践。课程内容涵......
  • Python 字符串格式化指南
    前言在Python中,字符串格式化是一种常见且重要的操作,用于将变量或值插入到字符串中,并控制输出的格式。本文将介绍几种常见的字符串格式化方法,帮助大家掌握在Python中有效地处理字符串的技巧。方法一:使用%操作符格式化字符串使用%操作符是一种传统的字符串格式化方法,可......
  • 洛谷题单指南-动态规划2-P1874 快速求和
    原题链接:https://www.luogu.com.cn/problem/P1874题意解读:一个数字字符串s,分解成几个整数,和为n,计算最少加号个数,也就是计算最少分解的整数个数-1。解题思路:此题虽然分类在动态规划,但数据量不大,DFS更加直观和易于理解,所以采用DFS暴搜+剪枝来解决。搜索思路是对数字字符串依次枚......
  • Pandas read_csv 参数详解
    前言在使用Pandas进行数据分析和处理时,read_csv是一个非常常用的函数,用于从CSV文件中读取数据并将其转换成DataFrame对象。read_csv函数具有多个参数,可以根据不同的需求进行灵活的配置。本文将详细介绍read_csv函数的各个参数及其用法,帮助大家更好地理解和利用这一功......
  • LoRa技术在物联网领域的安全性挑战与应对策略分享
    随着物联网技术的飞速发展,LoRa技术作为一种新兴的无线通信技术,在物联网领域展现出了广阔的应用前景。然而,与此同时,其安全性问题也日益凸显,成为了制约其进一步发展的重要因素。本文将深入分析LoRa网络存在的安全漏洞,探讨可能受到的攻击类型,并提出相应的应对策略。首先,我们需要认识......
  • gRPC和HTTP的对比
    概述gRPC和HTTP是两种常见的网络通信协议,用于在客户端和服务器之间进行通信。它们具有不同的特点和适用场景,下面进行详细比较。HTTP(HypertextTransferProtocol)特点简单易用:HTTP使用简单的请求方法和状态码来进行通信,如GET、POST、200OK、404NotFound等。它易于理......
  • 快速入门
    快速入门‍为什么不用Pyqt6,非要用PySide6开发程序呢?因为PySide6是Qt官方维护的py库,Pyqt6如果用于商业需要购买许可证,而PySide6的LGPL许可证,允许商业、非商业、开源或非开源。当然,PyQt6和PySide6大部分函数是一致的,网上的PyQt教程也比较丰富,可以先练习PyQt,发布源码时转为PySide6......