linkedblockingqueue 后 take 不消化_LinkedBlockingQueue源码详细解读

本文深入探讨了LinkedBlockingQueue,包括其基本属性、入队和出队的源码分析。重点讲解了add、offer、put、take等方法的异同,并对比了与其他阻塞队列的区别,揭示了其内部基于ReentrantLock的生产者-消费者模式。
摘要由CSDN通过智能技术生成

bb9c3fd07d7e133cc9115438b011914d.png

前文回顾

  • AQS源码详细解读
  • ReentrantLock源码详细解读

本文简单介绍下各种阻塞队列,然后详细看下LinkedBlockingQueue的源码。其实阻塞队列的实现,在思想上有很大一部分是相通的。而且在线程池中也会用到各种BlockingQueue,FixedThreadPool使用的就是LinkedBlockingQueue。知道一个以后其他的理解起来也不难。LinkedBlockingQueue的实现依赖于入队锁(putLock)和出队锁(takeLock),实际上就是一个ReentrantLock实现的生产者-消费者模式。不了解的同学可以先学习一下~

文章导读

  • 阻塞队列简述
  • LinkedBlockingQueue基本属性
  • 入队源码,add(),offer(),put(),enqueue()
  • 出队源码,poll(),take(),dequeue()
  • 总结

一、简单介绍各种阻塞队列

阻塞队列大致可以分为这几种:ArrayBlockingQueue,LinkedBlockingQueue,ConcurrentLinkedQueue,DelayQueue,LinkedTransferQueue,SynchronusQueue。

ArrayBlockingQueue--数组实现的有界队列
会自动阻塞,根据调用api不同,有不同特性,当队列容量不足时,有阻塞能力。
boolean add(E e):在容量不足时,抛出异常。
void put(E e):在容量不足时,阻塞等待。
boolean offer(E e):不阻塞,容量不足时返回false,当前新增数据操作放弃。
boolean offer(E e, long timeout, TimeUnit unit):容量不足时,阻塞times时长(单位为timeunit),如果在阻塞时长内,有容量空闲,新增数据返回true。如果阻塞时长范围内,无容量空闲,放弃新增数据,返回false。

LinkedBlockingQueue--链式队列,队列容量不足或为0时自动阻塞
void put(E e):自动阻塞,队列容量满后,自动阻塞。
E take():自动阻塞,队列容量为0后,自动阻塞。

ConcurrentLinkedQueue--基础链表同步队列
boolean offer(E e):入队。
E peek():查看queue中的首数据。
E poll():取出queue中的首数据。

DelayQueue--延时队列
根据比较机制,实现自定义处理顺序的队列。常用于定时任务,如:定时关机。
int compareTo(Delayed o):比较大小,自动升序。
比较方法建议和getDelay方法配合完成。如果在DelayQueue是需要按时完成的计划任务,必须配合getDelay方法完成。
long getDelay(TimeUnit unit):获取计划时长的方法&#x

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值