java.util.concurrent.PriorityBlockingQueue类

java.util.concurrent.PriorityBlockingQueue类


特点

PriorityBlockingQueue是结合PriorityQueueAQS
线程安全的优先级阻塞队列

  1. PriorityBlockingQueue线程安全的:线程会阻塞,直到PriorityBlockingQueue中有可用元素(即入队时队列非满、出队时队列非空)
  2. PriorityBlockingQueue默认是根据元素自然序排序,除非你实现了自己的Comparator进行自定义排序;
  3. PriorityBlockingQueue无界队列,因为其内部是动态数组,初始容量11,可以通过构造函数进行指定;
  4. PriorityBlockingQueue不允许null元素;
  5. PriorityBlockingQueuePriorityQueue一样都是小顶堆,队首元素优先级最低,每次出队都弹出队首
  6. 如果有多个元素优先级相同,会在它们中间随机弹出一个
  7. PriorityBlockingQueueiterator()不保证遍历元素的顺序,如果你需要顺序遍历,可以考虑使用Arrays.sort(priorityBlockingQueue.toArray())

API

  1. public boolean add(E e):内部调用offer()

  2. public boolean offer(E e)插入元素,如果是null抛出异常

  3. public E remove(object):移除元素

  4. public poll()尝试弹出队首,如果队列为空返回null

  5. public poll(timeout, timeUnit)尝试弹出队首,超过时间则放弃,如果队列为空返回null

  6. public take()阻塞尝试弹出队首,如果没有元素可用会一直阻塞等待

    所以如果要使用PriorityBlockingQueueAQS特性需要用take(),而非poll()

  7. void put(Object o):插入元素

    由于PriorityBlockingQueue是无界的,所以put/add/offer没有区别。

  8. void clear():清空队列

  9. Comparator comparator():返回队列使用使用的Comparator

  10. boolean contains(Object o):是否包含某个元素

  11. Iterator iterator():返回队列使用的迭代器

  12. int size():队列元素个数

  13. int drainTo(Collection c)按照优先级顺序移除全部元素,并且尾插进另一个集合

  14. int drainTo(Collection c, int maxElements)按照优先级顺序移除maxElements个元素,并且尾插进另一个集合

1
2
3
4
5
6
7
8
9
10
11
12
13
14
ArrayList<Integer> list = new ArrayList();
list.add(100);

PriorityBlockingQueue<Integer> phq = new PriorityBlockingQueue<Integer>();
phq.add(1);
phq.add(3);
phq.add(2);
phq.add(5);
phq.add(4);

phq.drainTo(list, 3);
System.out.println(list);
//输出:
//[100, 1, 2, 3]
  1. Object[] toArray():返回队列数组
-------------本文结束感谢您的阅读-------------

本文标题:java.util.concurrent.PriorityBlockingQueue类

文章作者:DragonBaby308

发布时间:2019年09月17日 - 11:15

最后更新:2019年09月28日 - 11:24

原始链接:http://www.dragonbaby308.com/java-util-concurrent-PriorityBlockingQueue/

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。

急事可以使用右下角的DaoVoice,我绑定了微信会立即回复,否则还是推荐Valine留言喔( ఠൠఠ )ノ
0%