Java线程池队列LinkedBlockingDeque
正文
public enum QueueTypeEnum { ARRAY_BLOCKING_QUEUE(1, "ArrayBlockingQueue"), LINKED_BLOCKING_QUEUE(2, "LinkedBlockingQueue"), DELAY_QUEUE(3, "DelayQueue"), PRIORITY_BLOCKING_QUEUE(4, "PriorityBlockingQueue"), SYNCHRONOUS_QUEUE(5, "SynchronousQueue"), LINKED_TRANSFER_QUEUE(6, "LinkedTransferQueue"), LINKED_BLOCKING_DEQUE(7, "LinkedBlockingDeque"), VARIABLE_LINKED_BLOCKING_QUEUE(8, "VariableLinkedBlockingQueue"), MEMORY_SAFE_LINKED_BLOCKING_QUEUE(9, "MemorySafeLinkedBlockingQueue"); }
LinkedBlockingDeque
LinkedBlockingDeque: 使用双向队列实现的有界双端阻塞队列。双端意味着可以像普通队列一样 FIFO(先进先出),也可以像栈一样 FILO(先进后出)。
LinkedBlockingDeque是一个基于链表的双端阻塞队列,和LinkedBlockingQueue类似,区别在于该类实现了Deque接口,而LinkedBlockingQueue实现了Queue接口。
LinkedBlockingDeque是一个可选容量的阻塞队列,如果没有设置容量,那么容量将是Int的最大值。
LinkedBlockingDeque的重要字段有如下几个:
//队列的头节点 transient Node<E> first; //队列的尾节点 transient Node<E> last; //队列中元素的个数 private transient int count; //队列中元素的最大个数 private final int capacity; //锁 final ReentrantLock lock = new ReentrantLock(); //队列为空时,阻塞take线程的条件队列 private final Condition notEmpty = lock.newCondition(); //队列满时,阻塞put线程的条件队列 private final Condition notFull = lock.newCondition();
从上面的字段,可以看到LinkedBlockingDeque内部只有一把锁以及该锁上关联的两个条件,所以可以推断同一时刻只有一个线程可以在队头或者队尾执行入队或出队操作。可以发现这点和LinkedBlockingQueue不同,LinkedBlockingQueue可以同时有两个线程在两端执行操作。
由于LinkedBlockingDeque是一个双端队列,所以就可以在队头执行入队和出队操作,也可以在队尾执行入队和出队操作。
public LinkedBlockingDeque() { this(Integer.MAX_VALUE); } public LinkedBlockingDeque(int capacity) { if (capacity <= 0) throw new IllegalArgumentException(); this.capacity = capacity; } public LinkedBlockingDeque(Collection<? extends E> c) { this(Integer.MAX_VALUE); final ReentrantLock lock = this.lock; lock.lock(); // Never contended, but necessary for visibility try { for (E e : c) { if (e == null) throw new NullPointerException(); if (!linkLast(new Node<E>(e))) throw new IllegalStateException("Deque full"); } } finally { lock.unlock(); } }
LinkedBlockingDeque和LinkedBlockingQueue的区别
LinkedBlockingDeque和LinkedBlockingQueue的相同点在于:
- 基于链表
- 容量可选,不设置的话,就是Int的最大值
LinkedBlockingDeque和LinkedBlockingQueue的不同点在于:
- 双端链表和单链表
- 不存在哨兵节点
- 一把锁+两个条件
以上就是Java线程池队列LinkedBlockingDeque的详细内容,更多关于Java线程池队列的资料请关注脚本之家其它相关文章!
相关文章
MyEclipse 2016 CI 4新增BootStrap模板
MyEclipse2016是一款全球使用最为广泛的企业级开发环境程序,这篇文章主要介绍了MyEclipse 2016 CI 4新增BootStrap模板的相关资料,非常不错,具有参考借鉴价值,需要的朋友可以参考下2016-06-06Java与Node.js利用AES加密解密出相同结果的方法示例
这篇文章主要介绍了Java与Node.js利用AES加密解密出相同结果的方法,文中给出了详细的示例代码,相信对大家的学习或者工作能带来一定的帮助,需要的朋友们下面来一起看看吧。2017-02-02Kotlin + Spring Boot 请求参数验证的代码实例
本篇文章主要介绍了Kotlin + Spring Boot 请求参数验证的代码实例,具有一定的参考价值,感兴趣的小伙伴们可以参考一下2017-07-07springboot项目中idea的pom.xml文件的引用标签全部爆红问题解决
这篇文章主要介绍了springboot项目中idea的pom.xml文件的引用标签全部爆红问题解决,本文通过图文并茂的形式给大家介绍的非常详细,需要的朋友参考下吧2023-12-12
最新评论