前文回顾
本文简单介绍下各种阻塞队列,然后详细看下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):