《Java源码分析》:BlockingQueue
2016年8月27日21:10:51,今天是学校报道的第一天,从今天开始,我也就研三了,哎,有时候只能感叹时间过的真快,自己的研究生生活只剩下最后一年。在最后的一年里,希望自己的一切都顺利吧,其中包括:找一份好的工作,顺利将手上的项目完成,顺利完成自己的毕设。
说了这么多,还是开始本篇博文的正题吧。在前一段时间研究了下J.U.C包下面并发类库的原理,也都形成了相应的博文,唯独关于阻塞队列BlockingQueue以及它的4个实现类ArrayBlockingQueue、LinkedBlockingQueue、PriorityBlockingQueue、SynchronousQueue的源码分析形成相应的博客。
今天抽空,又看了下这几个类的源码,也就做点记录并形成了这篇博文。
BlockingQueue
BlockingQueue是一个队列,还额外支持如下的操作:当获取元素时,如果队列为空,则一直等待直到队列非空。当存储元素时,如果队列中没有空间进行存储,则一直等待直到有空间进行存储。
1.BlockingQueue定义的常用方法如下:
Throws exception | Special value | Blocks | Times out | |
Insert | add(e) | offer(e) | put(e) | offer(e, time, unit) |
Remove | remove() | poll() | take() | poll(long, TimeUnit) |
Examine | element() | peek() | not applicable | not applicable |
上面就是BlockingQueue接口中提供的方法列表。
1、往队列中添加元素的方法有4钟,分别为:add(e)/offer(e)/put(e)/offer(e,time,unit)
2、往队列中取元素的方法有4种,分别为:remove()/poll()/take()/poll(long,TimeUnit).
3、检查队列中的元素有2种,分别为:element()/peek().
由于put()/take()方法是在并发中会发生阻塞,因此,我们以研究这两种方法的源码实现。
2、ArrayBlockingQueue
ArrayBlockingQueue是一个基于数组且有界的阻塞队列。此队列按 FIFO(先进先出)原则对元素进行排序。即队列头保存的是在队列中待的时间最长的元素。队列尾则是待的时间最短的元素。元素插入到对尾,在队首获取元素。
2.1ArrayBlockingQueue继承体系结构
public class