PriorityBlockingQueue简介
PriorityBlockingQueue 是带优先级的无界阻塞队列,在内部使用二叉树堆维护元素优先级,使用数组作为元素存储的数据结构,这个数组是可扩容的。出队时始终保证出队的元素是堆树的根节点,而不是在队列里面停留时间最长的元素。使用元素的 compareTo 方法提供默认的元素优先级比较规则,用户也可以自定义优先级的比较规则。
主要的方法介绍
§ offer(E e)
向队列中插入一个元素,由于是无界队列, 所以一直返回 true。
§ put(E e)
内部调用的是 offer 操作,由于是无界队列,所以不需要阻塞。
§ poll()
获取队列内部堆树的根节点元素,如果队列为空,则返回 null。
§ take()
获取队列内部堆树的根节点元素, 如果队列为空则阻塞。
size()
计算队列元素个数。
示例代码:
public class PriorityBlockingQueueTest { static class Task implements Comparable<Object>{ private int priority = 0; private String taskName; public int getPriority() { return priority; } public void setPriority(int priority) { this.priority = priority; } public String getTaskName() { return taskName; } public void setTaskName(String taskName) { this.taskName = taskName; } //执行任务 public void runTask(){ System.out.println(taskName+",优先级:"+priority+"执行完毕!"); } @Override public int compareTo(Object o) { if(this.priority >=((Task)o).getPriority()){ return 1; } return -1; } } public static void main(String[] args){ //创建任务队列 PriorityBlockingQueue<Task> queue = new PriorityBlockingQueue(); Random random = new Random(); for(int i=0;i<10;i++){ Task task = new Task(); task.setPriority(random.nextInt(10)); task.setTaskName("任务"+i); queue.offer(task); } //取出任务执行 while(!queue.isEmpty()){ Task task = queue.poll(); if(task!=null){ task.runTask(); } } } }
运行结果如下:
如上代码首先创建了一个 Task 类,该类继承了 Comparable 方法并重写了 compareTo 方法,自定义了元素优先级比较规则。然后在 main 函数里面创建了一个优先级队列,并使用随机数生成器生成10个随机优先级的任务,并将它们添加到优先级队列。最后 从优先级队列里面逐个获取任务并执行。从结果可知,任务执行的先后顺序和它们被放入队列的先后顺序没有关系,而是和它们的优先级有关系。