当前位置:网站首页 > 编程语言 > 正文

阻塞队列的作用(什么叫阻塞队列)



队列是一种先进先出的数据结构。而阻塞队列也是一种特殊的队列,也遵守”先进先出“的原则。

阻塞队列是一种线程安全的的数据结构,并且具有以下特性

1、队列往进写元素是从队尾插入,队首取出

2、当插入元素的时候,先判断一下,队列是否已经满了,如果满了就继续等(阻塞),等到队列有空余的位置的时候再去插入。

3、当取出元素的时候,先判断一下,队列是否为空,如果空了就继续等(阻塞),等到队列中有元素的时候再去取出。

阻塞队列有一个典型的应用场景就是”生产者消费者模型“,这是一种非常典型的开发模型。

生产者消费者模型:

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

生产者和消费者彼此之间不直接通讯,而是通过阻塞队列来进行通讯,所以生产者生产完数据之后不用原地等待消费者进行处理,直接扔给阻塞队列,消费者不找生产者要数据,而是直接从阻塞队列中获取。

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

比如在一些购物软件有"秒杀"场景,服务器在同一时刻可能会收到大量的支付请求,如果直接处理这些请求,服务器很有可能会扛不住大量数据的冲击(每一个支付请求的处理都需要比较复杂的流程),这个时候就可以把它放到一个阻塞队列中,然后由服务器慢慢处理每个支付请求。

这样做可以有效的进行“削峰",防止服务器被突然到来的一波请求直接冲垮。

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

比如过年一家人在一起包饺子,一般都是分工明确,比如一个人负责擀饺子皮,其他人负责包饺子,那么擀饺子皮的人就是生产者,包饺子的人就是消费者。

擀饺子皮的不关心包饺子的人是谁,只管擀包子皮,包饺子的人也不管擀包子皮的人是谁,只管包饺子。

 

 1.1、消息队列

消息队列是阻塞队列一种典型应用,基于消费者生产者模型实现的,是在业务的驱使下,应用队列这个数据结构做了一些自定义的功能开发,满组一些真实业务工作,类似这样的框架或是软件,被叫做“中间件”。

工作原理:

1、正常队列,先进先出,完全遵守这个顺序。

2、消息队列,把每个消息打了个”标签“。标签可以理解为”类型",把消息类型分类

1.2、为什么要使用消息队列(阻塞队列)?

1、解耦

现在的程序尽量做到高内聚,低耦合。 也就是业务强相关的代码放到一起,为了维护程序方便,设计和组织代码的一种方式。需要哪一种方法去接口调用即可,避免代码分散开发。

 2、削峰填谷

微博很难应对流量暴增的情况,流量暴增会在系统中申请很多很多线程,各种资源,最终会瞬间把服务器资源耗尽。

 

 陶宝应对流量冲击案例:

 

削峰:在流量暴增的时候用消息队列把消息缓存起来,后面的服务器一点一点正常处理。
填谷:消费信息的服务器在流量不多的情况下,处理之前堆积的消息,就是填谷

3、异步操作

在发起请求到接收到响应的过程中,啥也不干,叫做同步;如果发起请求之后去执行别任务,那么就叫做异步。

1.3、标准库中的阻塞队列 

在java标准库中内置了阻塞队列,如果需要在一些程序中使用阻塞队列,直接使用标准库中的即可。

*BlockingQueue是一个接口,真正实现类的是LinkedBlockingQueue。

*put方法用于阻塞式的入队列,take用于阻塞式的出队列。

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

 代码示例:

 
  

 1.4、阻塞队列的实现

*通过“循环队列”的方式来实现

*使用synchronized来进行加锁控制

*put插入元素的时候,判定如果队列满的话,就进行wait。(注意:要在循环的时候进行wait,被唤醒时不一定队列就不满了,因为同时可能唤醒了多个线程)

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

阻塞队列实现分析:

1、在普通队列的基础上加了等待操作,在入队时如果队列已满就要等,出队时队列为空就要等

2、在普通队列的基础上加上了唤醒操作,执行完入队操作就会唤醒出队线程,执行完出队操作就会唤醒入队线程

阻塞队列不可能出现即是空的,又是满的这种状态,所以不会出现相互等待的现象。

 

代码示例:

 
  
 
  

运行结果:

1.5、实现生产者消费者模型

代码示例:

 
  

 运行结果:

现象就是 ,生产者都把队列填满后,开始阻塞,等消费者一点一点消费,生产者一点一点生产。

调用wait()解决虚假唤醒问题 

 

更新代码: 

 

 
  

到此这篇阻塞队列的作用(什么叫阻塞队列)的文章就介绍到这了,更多相关内容请继续浏览下面的相关推荐文章,希望大家都能在编程的领域有一番成就!

版权声明


相关文章:

  • c1517-001故障码(c1516故障码)2025-11-21 20:45:06
  • vbh是什么品牌(vh是什么牌子)2025-11-21 20:45:06
  • 硬盘虚拟u盘(虚拟盘作用)2025-11-21 20:45:06
  • dos2unix命令离线安装(dism命令离线安装)2025-11-21 20:45:06
  • ngffm2接口(ngff接口和m.2接口无线网卡)2025-11-21 20:45:06
  • 获取位置在哪里设置(获取位置失败怎么打开)2025-11-21 20:45:06
  • py文件打开闪退问题(py文件运行后闪退)2025-11-21 20:45:06
  • 预训练模型下载(预训练模型是什么意思)2025-11-21 20:45:06
  • pdfview怎么转换pdf(pdfview文件怎么旋转)2025-11-21 20:45:06
  • 安卓版windows虚拟机下载安装(安卓windows虚拟机下载手机版)2025-11-21 20:45:06
  • 全屏图片