Jdk1.6 JUC源码解析(14)-PriorityBlockingQueue
作者:大飞
功能简介:
- PriorityBlockingQueue是一种基于PriorityQueue实现的无界的阻塞队列。队列中的元素按照某种排序规则出队。插入队列的元素必须是可比较的。
源码分析:
- 首先看下PriorityBlockingQueue内部的数据结构:
public class PriorityBlockingQueue<E> extends AbstractQueue<E> implements BlockingQueue<E>, java.io.Serializable { private static final long serialVersionUID = 5595510919245408276L; private final PriorityQueue<E> q; private final ReentrantLock lock = new ReentrantLock(true); private final Condition notEmpty = lock.newCondition(); public PriorityBlockingQueue() { q = new PriorityQueue<E>(); } public PriorityBlockingQueue(int initialCapacity) { q = new PriorityQueue<E>(initialCapacity, null); } public PriorityBlockingQueue(int initialCapacity, Comparator<? super E> comparator) { q = new PriorityQueue<E>(initialCapacity, comparator); } public PriorityBlockingQueue(Collection<? extends E> c) { q = new PriorityQueue<E>(c); }首先可见,内部是一个PriorityQueue(优先队列),然后有一把锁,一个锁条件。结构比较简单。
注:PriorityQueue内部数据结构是二叉堆,所谓二叉堆是一个完全二叉树,每个节点都比其左右两个子节点大(或者小),保证最大(小)的元素在堆顶,所以放入PriorityQueue的元素必须是可比较的。
- 还是从put和take实现看起,put实现如下:
public void put(E e) { offer(e); // never need to block } public boolean offer(E e) { final ReentrantLock lock = this.lock; lock.lock(); try { boolean ok = q.offer(e); assert ok; notEmpty.signal(); return true; } finally { lock.unlock(); } }由于PriorityBlockingQueue是一个无界队列,所以put方法不需要阻塞,直接往队列里面放。但要注意内存的限制。
再看下take方法实现:
public E take() throws InterruptedException { final ReentrantLock lock = this.lock; lock.lockInterruptibly(); try { try { while (q.size() == 0) notEmpty.await();//队列中没有元素时,当前线程在notEmpty上等待。 } catch (InterruptedException ie) { notEmpty.signal(); // propagate to non-interrupted thread throw ie; } E x = q.poll(); assert x != null; return x; } finally { lock.unlock(); } }
- 其他方法实现都较简单,这里不做一一分析。最后说一下,PriorityBlockingQueue的迭代器返回的元素是不保证顺序的。
PriorityBlockingQueue的代码解析完毕!
相关推荐
aspose-words-15.8.0-jdk1.6aspose-words-15.8.0-jdk1.6aspose-words-15.8.0-jdk1.6aspose-words-15.8.0-jdk1.6aspose-words-15.8.0-jdk1.6aspose-words-15.8.0-jdk1.6aspose-words-15.8.0-jdk1.6aspose-words-...
JDK 1.6 64位(jdk-6u45-windows-x64(1.6 64))
2部分: jdk-1.6-windows-64-01 jdk-1.6-windows-64-02
三部分: jdk-1.6-linux-64-1 jdk-1.6-linux-64-2 jdk-1.6-linux-64-3
1.okhttp3.8源码使用jdk1.6重新编译,已集成了okio,在javaweb项目中使用,未在安卓项目中使用 2.okhttp3.8源码使用jdk1.6重新编译_okhttp3.8.0-jdk1.6.jar
三部分: jdk-1.6-linux-64-1 jdk-1.6-linux-64-2 jdk-1.6-linux-64-3
jdk-jdk1.6.0.24-windows-i586.exe
三部分: jdk-1.6-linux-64-1 jdk-1.6-linux-64-2 jdk-1.6-linux-64-3
logback-cfca-jdk1.6-3.1.0.0.jar
文档介绍了JDK1.6安装及与JDK-1.5版本共存,已经在我的机子上通过了测试,按照文档操作即可。
jdk-1.6-linux-32-1 jdk-1.6-linux-32-2 jdk-1.6-linux-32-3
JDK-1.6-Windows-32位 纯官方安装版 JDK-1.6-Windows-32位 纯官方安装版
jdk-1.6-linux-32-1 jdk-1.6-linux-32-2 jdk-1.6-linux-32-3
jdk-1.6-windows-32-1 jdk-1.6-windows-32-2 jdk-1.6-windows-32-3
三部分: jdk-1.6-windows-32-1 jdk-1.6-windows-32-2 jdk-1.6-windows-32-3
三部分: jdk-1.6-windows-32-1 jdk-1.6-windows-32-2 jdk-1.6-windows-32-3
Java编程开发工具包,最新版本,很好用,经典
1、okhttp3.8源码使用jdk1.6重新编译,已集成了okio,仅在javaweb项目中使用。 2、另附json-20160810.jar
jdk1.6-jdk-6u43-windows32-i586
java环境搭建 jdk6(包含jre)64位 jdk-6u45-windows-x64