
Java中的壅塞队列接口BlockingQueue持续自Queue接口。
BlockingQueue接口供给了3个添加元素办法:
- add:添加元素到队列里,添加成功返回true,因为容量满了添加掉败会抛出IllegalStateException异常;
- offer:添加元素到队列里,添加成功返回true,添加掉败返回false;
- put:添加元素到队列里,如不雅容量满了会壅塞直到容量不满。
本文以ArrayBlockingQueue和LinkedBlockingQueue为例,分析它们的实现道理。
ArrayBlockingQueue的添加数据办法有add,put,offer这3个办法,总结如下:
ArrayBlockingQueue
ArrayBlockingQueue的道理就是应用一个可重入锁和这个锁生成的两个前提对象进行并发控制(classic two-condition algorithm)。
ArrayBlockingQueue是一个带有长度的壅塞队列,初始化的时刻必须要指定队列长度,且指定长度之后不许可进行修改。
它带有的属性如下:
- // 存储队列元素的数组,是个轮回数组
- final Object[] items;
- // 拿数据的索引,用于take,poll,peek,remove办法
- int takeIndex;
- // 放数据的索引,用于put,offer,add办法
- int putIndex;
- // 元素个数
- int count;
- // 可重入锁
- final ReentrantLock lock;
- // notEmpty前提对象,由lock创建
- private final Condition notEmpty;
- // notFull前提对象,由lock创建
- private final Condition notFull;
- public boolean add(E e) {
- if (offer(e))
- return true;
- else
- throw new IllegalStateException("Queue full");
- }
ArrayBlockingQueue有不合的几个数据添加办法,add、offer、put办法。
add办法:
- public boolean offer(E e) {
- checkNotNull(e); // 不许可元素为空
- final ReentrantLock lock = this.lock;
- lock.lock(); // 加锁,包管调用offer办法的时刻只有1个线程
- try {
- if (
推荐阅读
核心提示: 大年夜量来自于发念头和其他一些关键部件的监控数据,使得猜测性维修具备了可行性。越来越多的数据的收集和分析对象正在被开辟或者投入应用。大年夜量来自于发念头和其他一些关>>>详细阅读
本文标题:Java阻塞队列实现原理分析
地址:http://www.17bianji.com/lsqh/34749.html
1/2 1

网友点评
精彩导读
科技快报
品牌展示