聊一聊BlockingQueue

BlockingQueue,也叫阻塞队列,本身是一个继承自Queue的接口,并在Queue的基础上支持了两个附加操作:

  • 获取元素时,等待队列为非空
  • 存储元素时,等待空间变得可用

这些方法有4中形式:

  • 抛异常 ,如 add/remove/element;
  • 返回特殊值(null或者false),如offer/poll/peek;
  • 阻塞,如put/take;
  • 超时,如带超时时间参数的offer/poll;

同时,它也不支持null元素;

BlockingQueue可以限制容量,也可以不限制,如果限制容量,当元素超出此容量时,则无法阻塞的进行put操作,如果不限制容量,则容量大小限制为Integer.MAX_VALUE。

BlockingQueue常用在生产-消费模型应用中。

实现了BlockingQueue的子类有这些:

ArrayBlockingQueue

这是一个由数组支持的BlockingQueue,本质上是一个“有界缓冲区”,拥有固定大小的数组,这样的缓冲区一旦被创建,就不能再增加其容量了。

该实现是按照先进先出的原则对元素进行排序的。

LinkedBlockingQueue

这是一个基于链表的,范围任意的BlockingQueue;

基于链表的队列的吞吐量通常要高于介于数组的队列,但是其在并发应用中,可预知性较低。

也可以在构造的时候传入容量范围,用来防止队列孤独拓展;如果没有指定范围,则容量限制为Integer.MAX_VALUE。

除非插入的节点会使队列超出容量,否则每次插入后都会动态创建节点。

PriorityBlockingQueue

这也是一个无界的阻塞队列,使用了与ProrityQueue相同的顺序规则,并提供了阻塞获取操作的支持。

它虽然逻辑上是无界的,但是如果资源耗尽的时候添加元素,仍然会抛出内存溢出异常。

它不支持null元素;

依赖自然顺序(可用比较器自定义其他顺序规则)的优先级队列不允许插入不可比较的对象。

它的iterator方法获得的迭代器并不保。以特定的顺序遍历元素,如果要保证顺序,建议使用Arrays.sort()方法,

同时它也不保证同样优先级元素的顺序。

DelayQueue

这也是一个无界的阻塞对垒,不过它只有在延迟期满的时候才能从中提取元素,具体的使用参考源码,这个类用的比较少,这里就不多说了。

SynchronousQueue

看名字就知道这是一个与同步有关的阻塞队列,其特点是每个插入的操作必须等待另一个线程的对应的溢出操作,反之亦然。

你可能感兴趣的:(聊一聊BlockingQueue)