在任务调度场景中,经常需要让高优先级的任务先执行,低优先级的任务后执行,普通先进先出队列无法满足这个需求,而Java中的PriorityQueue可以很好地解决这个问题。PriorityQueue是基于优先级堆实现的无界队列,默认按照元素的自然顺序排序,也可以通过自定义比较器指定排序规则,非常适合用来实现基于优先级的任务队列。

定义带优先级的任务类
首先需要定义任务类,任务类需要包含优先级属性和任务内容,同时要实现Comparable接口,或者后续通过外部比较器来指定优先级比较规则。这里以自定义Comparable接口的方式为例,优先级数值越小表示优先级越高。
// 定义任务类,实现Comparable接口用于优先级比较
class PriorityTask implements Comparable<PriorityTask> {
// 优先级,数值越小优先级越高
private int priority;
// 任务名称
private String taskName;
// 任务内容
private String taskContent;
public PriorityTask(int priority, String taskName, String taskContent) {
this.priority = priority;
this.taskName = taskName;
this.taskContent = taskContent;
}
// 实现compareTo方法,按照优先级升序排序
@Override
public int compareTo(PriorityTask other) {
return Integer.compare(this.priority, other.priority);
}
// getter方法
public int getPriority() {
return priority;
}
public String getTaskName() {
return taskName;
}
public String getTaskContent() {
return taskContent;
}
@Override
public String toString() {
return "任务名称:" + taskName + ",优先级:" + priority + ",内容:" + taskContent;
}
}
基于PriorityQueue封装任务队列
接下来使用PriorityQueue来封装任务队列,提供添加任务、获取最高优先级任务、判断队列是否为空等基础方法,同时可以扩展批量添加任务、查看队列所有任务等功能。
import java.util.PriorityQueue;
import java.util.List;
import java.util.ArrayList;
class PriorityTaskQueue {
// 内部使用PriorityQueue存储任务
private PriorityQueue<PriorityTask> queue;
public PriorityTaskQueue() {
// 初始化PriorityQueue,任务类已经实现Comparable接口,无需额外传入比较器
queue = new PriorityQueue<>();
}
// 添加单个任务到队列
public void addTask(PriorityTask task) {
queue.offer(task);
}
// 批量添加任务到队列
public void addTasks(List<PriorityTask> tasks) {
for (PriorityTask task : tasks) {
queue.offer(task);
}
}
// 获取并移除队列中优先级最高的任务
public PriorityTask pollHighestPriorityTask() {
return queue.poll();
}
// 获取但不移除队列中优先级最高的任务
public PriorityTask peekHighestPriorityTask() {
return queue.peek();
}
// 判断队列是否为空
public boolean isEmpty() {
return queue.isEmpty();
}
// 获取队列当前所有任务(注意:PriorityQueue的迭代顺序不保证是排序后的顺序)
public List<PriorityTask> getAllTasks() {
return new ArrayList<>(queue);
}
}
测试优先级任务队列功能
编写测试代码验证任务队列的优先级排序功能,添加不同优先级的任务后,依次取出任务观察是否按照优先级从高到低输出。
import java.util.Arrays;
public class PriorityQueueTest {
public static void main(String[] args) {
// 创建优先级任务队列
PriorityTaskQueue taskQueue = new PriorityTaskQueue();
// 添加不同优先级的任务,优先级数值越小优先级越高
taskQueue.addTask(new PriorityTask(3, "数据备份", "备份用户数据到远程服务器"));
taskQueue.addTask(new PriorityTask(1, "系统告警", "处理CPU使用率过高告警"));
taskQueue.addTask(new PriorityTask(2, "日志清理", "清理7天前的系统日志"));
taskQueue.addTask(new PriorityTask(1, "紧急修复", "修复支付接口异常问题"));
// 依次取出任务,验证是否按优先级执行
System.out.println("任务执行顺序:");
while (!taskQueue.isEmpty()) {
PriorityTask task = taskQueue.pollHighestPriorityTask();
System.out.println(task);
}
}
}
上述测试代码执行后,输出结果会先输出两个优先级为1的任务,再输出优先级为2的任务,最后输出优先级为3的任务,符合优先级调度的预期。
使用注意事项
- PriorityQueue是线程不安全的,如果在多线程场景下使用,需要额外加锁或者使用
PriorityBlockingQueue来实现线程安全的优先级任务队列。 - PriorityQueue的
iterator()方法返回的迭代器不保证按照优先级顺序遍历元素,如果需要按顺序获取所有任务,需要依次调用poll()方法取出。 - 自定义任务类时,如果选择不实现
Comparable接口,也可以在创建PriorityQueue时传入自定义Comparator比较器,例如按照优先级降序排序可以传入(a,b) -> Integer.compare(b.getPriority(), a.getPriority())。 - PriorityQueue是基于堆实现的,添加和移除元素的时间复杂度为O(log n),获取队首元素的时间复杂度为O(1),适合频繁添加和取出任务的场景。
PriorityQueue任务队列优先级调度Java集合修改时间:2026-06-12 14:12:28