LinkedBlockingQueue - 秒懂 - 图解

本文深入剖析了LinkedBlockingQueue的工作原理,包括其构造函数、内部成员、添加与删除操作的实现细节,以及与ArrayBlockingQueue的区别。
该文章已生成可运行项目,

说明:阅读本文之前,请先掌握本文前置知识: 跳表 核心原理 图解,以及ConcurrentSkipListMap - 秒懂

JUC 高并发工具类(3文章)与高并发容器类(N文章) :


说明:阅读本文之前,请先掌握本文前置知识: BlockingQueue -秒懂-图解

1 LinkedBlockingQueue的基本概要

LinkedBlockingQueue是一个基于链表的阻塞队列,其内部维持一个基于链表的数据队列,实际上我们对LinkedBlockingQueue的API操作都是间接操作该内部数据队列,

7.5.1 LinkedBlockingQueue 构造函数

LinkedBlockingQueue是一个由链表实现的有界队列阻塞队列,但大小默认值为Integer.MAX_VALUE,所以我们在使用LinkedBlockingQueue时建议手动传值,为其提供我们所需的大小,避免队列过大造成机器负载或者内存爆满等情况。其构造函数如下

/** 
 * 默认情况下,创建一个容量为 Integer.MAX_VALUE 的 LinkedBlockingQueue 
 */  

public LinkedBlockingQueue() {  

  this(Integer.MAX_VALUE);  

}  

/** 
 * 创建一个具有给定(固定)容量的 LinkedBlockingQueue 
 */  

public LinkedBlockingQueue(int capacity) {  

  if (capacity <= 0)  

      throw new IllegalArgumentException();  
  this.capacity = capacity;  
  last = head = new Node<E>(null);  

}  
 

/** 
  * 创建一个容量为 Integer.MAX_VALUE 的 LinkedBlockingQueue, 
  * 最初包含给定 collection 的元素,元素按该 collection 迭代器的遍历顺序添加。 
 */  
public LinkedBlockingQueue(Collection<? extends E> c) {  
  this(Integer.MAX_VALUE);  
  for (E e : c)  
      add(e);  
}  

三个构造函数的说明如下:

  • 默认构造方法创建一个容量为 Integer.MAX_VALUE的 LinkedBlockingQueue实例。

  • 第二种构造方法,指定了队列容量,首先判断指定容量是否大于零,否则抛出异常。然后为 capacity 赋值,最后创建空节点,并指向 head与 last,两者的 item与 next此时均为 null。

  • 第3种,利用循环向队列中添加指定集合中的元素。

LinkedB

本文章已经生成可运行项目
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值