玖叶教程网

前端编程开发入门

java并发之PriorityBlockingQueue类的简介和使用

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个随机优先级的任务,并将它们添加到优先级队列。最后 从优先级队列里面逐个获取任务并执行。从结果可知,任务执行的先后顺序和它们被放入队列的先后顺序没有关系,而是和它们的优先级有关系。

发表评论:

控制面板
您好,欢迎到访网站!
  查看权限
网站分类
最新留言