LinkedBlockingQueue:阻塞队列
是一种单向阻塞链表,是线程安全的队列。先进先出,可以指定最大容量,也可以不指定最大容量,如果不指定的话,默认最大值是Integer.MAX_VALUE
PriorityBlockingQueue:带排序的 BlockingQueue 实现
PriorityBlockingQueue 只能指定初始的队列大小,后面插入元素的时候,如果空间不够的话会自动扩容。简单地说,它就是 PriorityQueue 的线程安全版本。不可以插入 null 值,同时,插入队列的对象必须是可比较大小的(comparable),否则报 ClassCastException 异常。它的插入操作 put 方法不会 block,因为它是无界队列(take 方法在队列为空的时候会阻塞)。
主要方法
向队列中添加元素的方法有:put,add,offer
add:若超出了度列的长度会直接抛出异常。
put: 若向队尾添加元素的时候发现队列已经满了会发生阻塞一直等待空间,以加入元素。
offer, 在添加元素时,如果队列已满则返回false 和 poll对应
从队列中取出并移除元素的方法有:poll,remove,take
poll: 若队列为空,返回null。
remove:若队列为空,抛出NoSuchElementException异常。
take:若队列为空,发生阻塞,等待有元素。
总结
ArrayBlockingQueue 底层是数组,有界队列,如果我们要使用生产者-消费者模式,这是非常好的选择。
LinkedBlockingQueue 底层是链表,可以当做无界和有界队列来使用,所以大家不要以为它就是无界队列。
SynchronousQueue 本身不带有空间来存储任何元素,使用上可以选择公平模式和非公平模式。
PriorityBlockingQueue 是无界队列,基于数组,数据结构为二叉堆,数组第一个也是树的根节点总是最小值。
网友评论