PriorityBlockingQueue】的更多相关文章

package com.thread.test.thread; import java.util.Random; import java.util.concurrent.*; /** * Created by windwant on 2016/5/26. */ public class MyBlockingQueue { public static void main(String[] args) throws InterruptedException { testArrayBlockingQu…
package concurrent2; import java.util.ArrayList; import java.util.List; import java.util.Queue; import java.util.Random; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.PriorityBlockingQ…
java PriorityBlockingQueue 基于优先级队列.的读出操作可以阻止. package org.rui.thread.newc; import java.util.ArrayList; import java.util.List; import java.util.Queue; import java.util.Random; import java.util.concurrent.ExecutorService; import java.util.concurrent.Ex…
1.PriorityBlockingQueue public class PriorityBlockingQueue<E> extends AbstractQueue<E> implements BlockingQueue<E>, Serializable 所有添加进入PriorityBlockingQueue的元素都必须实现Comparable接口.当插入元素时,PriorityBlockingQueue会使用CompareTo()方法来决定元素插入的位置,元素越大越…
前面讲ScheduledThreadPoolExecutor曾经重点讲到了DelayedWorkQueue,这里说的PriorityBlockingQueue其实是DelayedWorkQueue的简化版本,实现了按序排列元素的功能.也就是说PriorityBlockingQueue是维护一个按序排列的队列,排序的方法可以通过指定Comparator来比较元素的大小,或者元素类型本身实现了Comparable接口. 因此PriorityBlockingQueue也是使用基于数组的二叉堆来实现的.…
问题 (1)PriorityBlockingQueue的实现方式? (2)PriorityBlockingQueue是否需要扩容? (3)PriorityBlockingQueue是怎么控制并发安全的? 简介 PriorityBlockingQueue是java并发包下的优先级阻塞队列,它是线程安全的,如果让你来实现你会怎么实现它呢? 还记得我们前面介绍过的PriorityQueue吗?点击链接直达[死磕 java集合之PriorityQueue源码分析] 还记得优先级队列一般使用什么来实现吗?…
package com.gf.conn013; import java.util.Iterator; import java.util.concurrent.PriorityBlockingQueue; /** * * PriorityBlockingQueue: 基于优先级的阻塞队列(优先级的判断通过构造函数传入的的Compator对象决定,也就是传入的队列的对象必须实现Comparable接口) * 在实现PriorityBlockiongQueue时,内部控制线程同步的锁采用的是公平锁 *…
java中PriorityBlockingQueue 和DelayedWorkQueue 区别…
PriorityBlockingQueue是一个支持优先级的无界阻塞队列,直到系统资源耗尽.默认情况下元素采用自然顺序升序排列.也可以自定义类实现compareTo()方法来指定元素排序规则,或者初始化PriorityBlockingQueue时,指定构造参数Comparator来对元素进行排序.但需要注意的是不能保证同优先级元素的顺序.PriorityBlockingQueue也是基于最小二叉堆实现,使用基于CAS实现的自旋锁来控制队列的动态扩容,保证了扩容操作不会阻塞take操作的执行. P…
JDK 中无界优先级队列PriorityBlockingQueue 内部使用堆算法保证每次出队都是优先级最高的元素,元素入队时候是如何建堆的,元素出队后如何调整堆的平衡的? PriorityBlockingQueue是带优先级的无界阻塞队列,每次出队都返回优先级最好或者最低的元素,内部是平衡二叉树堆的实现. 首先看一下PriorityBlockingQueue类图结构,如下: 可以看到PriorityBlockingQueue内部有个数组queue用来存放队列元素,size用来存放队列元素个数,…
PriorityBlockingQueue是一个基于数组实现的线程安全的无界队列,原理和内部结构跟PriorityQueue基本一样,只是多了个线程安全.javadoc里面提到一句,1:理论上是无界的,所以添加元素可能导致outofmemoryerror:2.不容许添加null:3.添加的元素使用构造时候传入Comparator排序,要不然就使用元素的自然排序. PriorityBlockingQueue是基于优先级,不是FIFO,这是个好东西,可以用来实现优先级的线程池,高优先级的先执行,低优…
转载请注明源出处:http://www.cnblogs.com/lighten/p/7510799.html 1.前言 本章介绍阻塞队列PriorityBlockingQueue.这是一个无界有序的阻塞队列,排序规则和之前介绍的PriorityQueue一致,只是增加了阻塞操作.同样的该队列不支持插入null元素,同时不支持插入非comparable的对象.它的迭代器并不保证队列保持任何特定的顺序,如果想要顺序遍历,考虑使用Arrays.sort(pq.toArray()).该类不保证同等优先级…
简介 基于数据结构堆实现的线程安全的无界队列,这个堆的内存结构是数组,结合了数组和二叉树的特点. 堆 以下内容参考<编程珠玑>和<算法导论>有关堆的章节. 数据结构 堆是用来表示元素集合的一种数据结构. 性质 顺序,任何结点的值都小于(大或于)等于其子结点的值. 形状,是一个数组,却可以被看成一个近似的完全二叉树,除了底层外,该树是完全充满的,而且是从左往右填充. 如上图所示,堆使用的是从下标1开始的数组,常见的方法如下: root = 1 value(i) = x[i] left…
摘自<Java编程思想> package com.test.concurrency; import java.util.ArrayList; import java.util.List; import java.util.Queue; import java.util.Random; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concu…
阻塞场景 BlockingQueue阻塞队列,阻塞的情况主要有如下2种: 1. 当队列满了,进行入队操作阻塞 2. 当队列空了,进行出队操作阻塞 阻塞队列主要用在生产者/消费者模式中,下图展示了一个线程生产,一个线程消费的场景: BlockingQueue接口 操作 抛异常 特殊值 阻塞 超时 插入 add(o) offer(o) put(o) offer(o,timeout,unit) 删除 remove(o) poll() take() poll(timeout,unit) 1. 抛出异常:…
转载请注明原创地址http://www.cnblogs.com/dongxiao-yang/p/6293807.html java.util.concurrent.PriorityBlockingQueue内部用二叉堆实现了一个优先队列,所有插入的元素必须实现java.lang.Comparable接口.由于完全二叉树可以用数组来表示,所以队列内部元素存放在可变长度数组queue里. private transient Object[] queue; //用于存放元素的数组 一 插入元素入队 p…
PriorityBlockingQueue是一个支持优先级的无界阻塞队列. 它使用了和类 java.util.PriorityQueue 一样的排序规则.你无法向这个队列中插入 null 值. 所有插入到 PriorityBlockingQueue 的元素必须实现 java.lang.Comparable 接口.因此该队列中元素的排序就取决于你自己的 Comparable 实现. PriorityBlockingQueue 对于具有相等优先级(compare() == 0)的元素并不强制任何特定…
public class PriorityBlockingQueueTest { /** * 有优先级顺序的阻塞队列,底层实现是数组,无边界.默认是11. * 构造方法可以传入一个比较器,不传的话,默认是按照字典排序比较大小 * 向队列中插入元素用 add offer , put 三个方法效果是等同的,因为是无边界的,put不会阻塞 * 从队列中取出数据用 remove poll , take ,只有take方法在队列为空时会阻塞 * @param args */ public static v…
LinkedTransferQueue 功能 全名 public class LinkedTransferQueue<E> extends AbstractQueue<E> implements TransferQueue<E>, Serializable 简述 基于链表的的无界队列.队列的头是某个生产者在队列中停留时间最长的元素.队列的尾部是某个生产者在队列中时间最短的元素. 注意,与大多数集合不同,size方法不是一个常量时间操作.由于这些队列的异步性,确定当前元素…
今天继续说一说阻塞队列的实现,今天的主角就是优先级阻塞队列PriorityBlockingQueue,从命名上看觉得应该是有序的,毕竟是优先级队列,那么实际上是什么情况,我们一起看下其内部实现,提前说明下,因为PriorityBlockingQueue涉及到了堆排序的相关使用,如果没了解清楚,可以参考我之前写的关于堆排序的相关说明 前言 JDK版本号:1.8.0_171 PriorityBlockingQueue是一个无限容量的阻塞队列,当然,最终还是受内存限制,内部实现是数组,不停增长下去会导…
前言 接下来继续BlockingQueue的另一个实现,优先级阻塞队列PriorityBlockingQueue.PriorityBlockingQueue是一个无限容量的阻塞队列,由于容量是无限的所以put等入队操作其实不存在阻塞,只要内存足够都能够立即入队成功,当然多个入队操作的线程之间还是存在竞争唯一锁的互斥访问.虽然PriorityBlockingQueue逻辑上是无界的,但是尝试添加元素时还是可能因为资源耗尽而抛出OutOfMemoryError. 该队列也不允许放入null值,它使用…
PriorityBlockingQueue PriorityBlockingQueue 能解决什么问题?什么时候使用 PriorityBlockingQueue? 1)PriorityBlockingQueue 是基于优先级堆实现的线程安全的.无界.优先级.阻塞队列. 2)队列的元素按照其自然顺序进行排序,或者根据构造队列时提供的 Comparator 进行排序. take 操作会移除并返回优先级最高的元素,如果队列为空,则当前线程被阻塞. 如何使用 PriorityBlockingQueue?…
JUC源码分析-集合篇(七)PriorityBlockingQueue PriorityBlockingQueue 是带优先级的无界阻塞队列,每次出队都返回优先级最高的元素,是二叉树最小堆的实现. PriorityBlockingQueue 数据结构和 PriorityQueue 一致,而线程安全性使用的是 ReentrantLock. 1. 基本属性 // 最大可分配队列容量 Integer.MAX_VALUE - 8,减 8 是因为有的 VM 实现在数组头有些内容 private stati…
PriorityBlockingQueue:优先阻塞队列:是带有优先级的阻塞队列,一个无界阻塞队列,它使用与类 PriorityQueue 相同的顺序规则,并且提供了阻塞获取操作.虽然此队列逻辑上是无界的,但是资源被耗尽时试图执行 add 操作也将失败(导致 OutOfMemoryError).此类不允许使用 null 元素.依赖自然顺序的优先级队列也不允许插入不可比较的对象(这样做会导致抛出 ClassCastException). package com.houjun.current.new…
这一篇说一下PriorityBlockingQueue,引用书中的一句话:这就是带优先级的无界阻塞队列,每次出队都返回优先级最高或者最低的元素(这里规则可以自己制定),内部是使用平衡二叉树实现的,遍历不保证有序: 其实也比较容易,就是基于数组实现的一个平衡二叉树,不了解平衡二叉树的可以先了解一下,别想的太难,原理跟链表差不多,只不过链表中指向下一个节点的只有一个,而平衡二叉树中有两个,一个左,一个右,还有左边的节点的值小于当前节点的值,右边节点的值大于当前节点的值:看看平衡二叉树的增删改查即可:…
1.PriorityBlockingQueue里面存储的对象必须是实现Comparable接口. 2.队列通过这个接口的compare方法确定对象的优先级priority. 规则是:当前和其他对象比较,如果compare方法返回负数,那么在队列里面的优先级就比较高. 下面的测试可以说明这个断言: 查看打印结果,比较take出来的Entity和left的entity,比较他们的priority public class TestPriorityQueue { static Random r=new…
-- 1.优先级阻塞队列 当前核心记账业务是悲观锁实现,但考虑到高并发和死锁的问题,可以用PriorityBlockingQueue优先阻塞队列结合乐观锁实现,对于并发时出现锁无法update时可以重新进入队列并调整优先级进行记账处理. 新方案:乐观锁:PriorityBlockingQueue<T> 优先级队列串行化记账请求,乐观锁处理账户表相关的数据一致性问题,当数据不一致时将优先级调整再次进入记账队列. PriorityBlockingQueue是无界队列,与缓存线程池一样,使用时要千万…
目录 PriorityBlockingQueue概述 类图结构及重要字段 什么是二叉堆 堆的基本操作 向上调整void up(int u) 向下调整void down(int u) 构造器 扩容方法tryGrow 源码中向上调整和向下调整实现 siftUpComparable siftDownComparable heapify建堆or堆化 put非阻塞式插入 take阻塞式获取 remove移除指定元素 总结 参考阅读 系列传送门: Java并发包源码学习系列:AbstractQueuedSy…
介绍 当你看本文时,需要具备以下知识点 二叉树.完全二叉树.二叉堆.二叉树的表示方法 如果上述内容不懂也没关系可以先看概念. PriorityBlockingQueue是一个无界的基于数组的优先级阻塞队列,数组的默认长度是11,虽然指定了数组的长度,但是可以无限的扩充,直到资源消耗尽为止,每次出队都返回优先级别最高的或者最低的元素.其实内部是由平衡二叉树堆来进行排序的,先进行构造二叉树堆,二叉树堆排序出来的数每次第一个元素和最后一个元素进行交换,这样最大的或最小的数就到了最后面,然后最后一个不变…
本文讲PriorityBlockingQueue(优先阻塞队列) 1. 介绍 一个无界的具有优先级的阻塞队列,使用跟PriorityQueue相同的顺序规则,默认顺序是自然顺序(从小到大).若传入的对象,不支持比较将报错( ClassCastException).不允许null. 底层使用的是基于数组的平衡二叉树堆实现(它的优先级的实现). 公共方法使用单锁ReetrantLock保证线程的安全性. 1.1 类结构 PriorityBlockingQueue类图 重要的参数 // 数组的默认大小…