【Java 并发】【十】【JUC数据结构】【二】BlockingQueue阻塞队列原理

发布时间 2023-04-09 13:26:09作者: 酷酷-

1  前言

这节我们就来看看BlockingQueue阻塞队列是什么都有哪些具体实现。

2  BlockingQueue阻塞队列是什么

BlockingQueue阻塞队列,它是一个提供阻塞功能的队列容器。
首先它是一个队列容器,能够存储东西,提供数据入队功能,进行数据存入;提供数据取出功能,进行出队,如下图所示:

其次它提供一些往容器存入数据、向容器取数据的api提供具有阻塞的功能。
比如说在队列容量满的时候,它提供的一些存放数据的api具有阻塞功能,如下图所示:

在队列是空的时候,提供的部分取数据的api会造成调用线程被阻塞,如下图所示:

那么了解完阻塞队列是什么,能做什么以后,我们来看下具体是如何实现的。

3  BlockingQueue提供API分类

BlockingQueue提供的api相当灵活,这里不是所有存、取的api都是阻塞的,考虑到有些场景是不需要阻塞的。
(1)比如有些场景我需要往队列里面存数据,但是如果容量满了,不能存了,我希望能立即得到结果,不被阻塞;
  有些场景我希望指定一个阻塞时间,超过这个时间队列还是满的,存入数据失败,我希望就不被阻塞了,能立即返回,让我空出线程来做其它时间。同样在往队列里面取数据的时候也是一样的。
(2)提供了三种类型api:
  第一类api:在队列满的时候,往队列里面存数据的线程被阻塞,直到队列不满的时候才被唤醒,然后继续尝试往队列里面存数据;同样在队列是空的时候,取数据会一直被阻塞,直到队列非空被唤醒,然后继续尝试。
  第二类api:在队列满时,调用存入数据方法,不会被阻塞,直接返回存入失败。同理在队列是空时,调用取数据方法,直接返回失败,不会被阻塞。
  第三类api:在队列满时,提供一个最大阻塞等待的时间,未超过此时间则一直被阻塞,超过此时间存入数据失败,则返回失败。同理在队列是空时,提供一个最大阻塞等待时间,未超过此时间一直被阻塞,超过此时间取数据失败,则返回获取数据失败。

4  BlockingQueue的API和子类

阻塞队列一般都会有这几类的api提供,BlockingQueue阻塞队列提供的公用方法如下:

 BlockingQueue毕竟是个抽象的接口,我们看下它的子类,看一下阻塞队列都有哪些:

当然实际上阻塞队列的种类不止这些,只不过列出的这些阻塞队列是我们经常使用的而已。

5  小结

这节大致上阻塞队列是什么东西,还有它有哪些种类,这些基本的基础知识你都理解清楚了。接下来我们就是分析一些常用的阻塞队列,深入分析它内部是怎么实现的。有理解不对的地方欢迎指正哈。