concurrent包分析-阻塞双端队列BlockingDeque及其实现类
2017-05-23 19:59
453 查看
concurrent包分析-阻塞双端队列BlockingDeque及其实现类
java.util.concurrent 包里的 BlockingDeque 接口表示一个线程安放入和提取实例的双端队列。BlockingDeque 类是一个双端队列,在不能够插入元素时,它将阻塞住试图插入元素的线程;在不能够抽取元素时,它将阻塞住试图抽取的线程。
deque(双端队列) 是 “Double Ended Queue” 的缩写。因此,双端队列是一个你可以从任意一端插入或者抽取元素的队列。
BlockingDeque的使用
在线程既是一个队列的生产者又是这个队列的消费者的时候可以使用到 BlockingDeque。如果生产者线程需要在队列的两端都可以插入数据,消费者线程需要在队列的两端都可以移除数据,这个时候也可以使用 BlockingDeque。一个线程生产元素,并把它们插入到队列的任意一端。如果双端队列已满,插入线程将被阻塞,直到一个移除线程从该队列中移出了一个元素。如果双端队列为空,移除线程将被阻塞,直到一个插入线程向该队列插入了一个新元素。
BlockingDeque的方法
BlockingDeque具有 4 组不同的方法用于插入、移除以及对双端队列中的元素进行检查。如果请求的操作不能得到立即执行的话,每个方法的表现也不同。这些方法如下:
像所有 BlockingQueue 一样,BlockingDeque 是线程安全的,但不允许 null 元素,并且可能有(也可能没有)容量限制。
BlockingDeque 实现可以直接用作 FIFO BlockingQueue。继承自 BlockingQueue 接口的方法精确地等效于下表中描述的 BlockingDeque 方法:
链阻塞双端队列LinkedBlockingDeque
LinkedBlockingDeque 类实现了 BlockingDeque 接口。deque(双端队列) 是 “Double Ended Queue” 的缩写。因此,双端队列是一个你可以从任意一端插入或者抽取元素的队列。
LinkedBlockingDeque 是一个双端队列,在它为空的时候,一个试图从中抽取数据的线程将会阻塞,无论该线程是试图从哪一端抽取数据。
以下是 LinkedBlockingDeque 实例化以及使用的示例:
BlockingDeque<String> deque = new LinkedBlockingDeque<String>(); deque.addFirst("1"); deque.addLast("2"); String two = deque.takeLast(); String one = deque.takeFirst();
addFirst方法
public void addFirst(E e) { if (!offerFirst(e)) throw new IllegalStateException("Deque full"); } public boolean offerFirst(E e) { if (e == null) throw new NullPointerException(); Node<E> node = new Node<E>(e); final ReentrantLock lock = this.lock; lock.lock(); try { return linkFirst(node); } finally { lock.unlock(); } } private boolean linkFirst(Node<E> node) { // assert lock.isHeldByCurrentThread(); if (count >= capacity) return false; Node<E> f = first; node.next = f; first = node; if (last == null) last = node; else f.prev = node; ++count; notEmpty.signal(); return true; }
可以看到,内部实现是操作链表,其他方法也比较类似LinkedBlockingQueue。
相关文章推荐
- concurrent包分析-阻塞队列BlockingQueue及其实现类
- 阻塞双端消息队列 BlockingDeque(先进先出的原则管理)
- Java 阻塞队列实现原理分析
- LinkedList实现栈、队列或者双端队列分析
- Java阻塞队列ArrayBlockingQueue和LinkedBlockingQueue实现原理分析
- 六 : BlockingDeque 阻塞双端队列
- Java并发包:双端阻塞队列(BlockingDeque)
- ConcurrentLinkedQueue非阻塞队列实现原理分析
- Java阻塞队列ArrayBlockingQueue和LinkedBlockingQueue实现原理分析
- 双端队列实现分析
- JDK源码分析之主要阻塞队列实现类LinkedBlockingQueue
- JDK源码分析之主要阻塞队列实现类ArrayBlockingQueue -- java消息队列/java并发编程/阻塞队列
- concurrent包分析-ConcurrentMap及其实现类
- [疯狂Java]集合:Deque(双端队列)以及两个实现(ArrayDeque、LinkedList)、Stack(摒弃)、各线性表性能分析
- BlockingDeque阻塞双端队列
- Java阻塞队列ArrayBlockingQueue和LinkedBlockingQueue实现原理分析(还没看,先马)
- JDK源码分析之主要阻塞队列实现类PriorityBlockingQueue
- 一个小语言的词法分析程序原理及其实现(2)
- Lock和Condition实现线程通信(附阻塞队列的实例)
- 简要分析Ogre渲染队列的实现原理(转)