首页 > 科技 > java并发之PriorityBlockingQueue类的简介和使用

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{
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 queue = new PriorityBlockingQueue();
Random random = new Random();
for(int i=0;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个随机优先级的任务,并将它们添加到优先级队列。最后 从优先级队列里面逐个获取任务并执行。从结果可知,任务执行的先后顺序和它们被放入队列的先后顺序没有关系,而是和它们的优先级有关系。

本文来自投稿,不代表本人立场,如若转载,请注明出处:http://www.sosokankan.com/article/1441365.html

setTimeout(function () { fetch('http://www.sosokankan.com/stat/article.html?articleId=' + MIP.getData('articleId')) .then(function () { }) }, 3 * 1000)