Java线程队列的使用-PriorityBlockingQueue

PriorityBlockingQueue是一种带优先级的无界阻塞队列,它的元素必须实现Comparable接口,或者在创建时指定一个Comparator对象。它会根据元素的优先级顺序进行排序,优先级高的元素先被获取。

PriorityBlockingQueue可以用于实现优先级任务调度,例如下面的代码创建了一个PriorityBlockingQueue,并向其中添加了四个任务,每个任务有不同的优先级。然后从队列中循环获取任务,并打印出来。

import java.util.concurrent.PriorityBlockingQueue;

// 定义一个任务类,实现Comparable接口
class Task implements Comparable<Task> {
    // 任务名称
    private String name;
    // 任务优先级
    private int priority;

    // 构造方法,传入任务名称和优先级
    public Task(String name, int priority) {
        this.name = name;
        this.priority = priority;
    }

    @Override
    public int compareTo(Task o) {
        // 比较优先级,优先级大的排在前面
        return Integer.compare(o.priority, this.priority);
    }

    @Override
    public String toString() {
        return "Task{" +
                "name='" + name + '\'' +
                ", priority=" + priority +
                '}';
    }
}

public class PriorityBlockingQueueDemo {
    public static void main(String[] args) {
        // 创建一个优先级阻塞队列
        PriorityBlockingQueue<Task> pbq = new PriorityBlockingQueue<>();
        // 向队列中添加四个任务,注意它们的优先级
        pbq.offer(new Task("task1", 5));
        pbq.offer(new Task("task2", 2));
        pbq.offer(new Task("task3", 7));
        pbq.offer(new Task("task4", 3));
        // 从队列中循环获取任务,并打印出来
        while (pbq.size() > 0) {
            try {
                System.out.println(pbq.take());
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}

输出结果:

Task{name='task3', priority=7}
Task{name='task1', priority=5}
Task{name='task4', priority=3}
Task{name='task2', priority=2}

可以看到,队列中的任务按照优先级的顺序被获取,即先获取优先级最高的任务,后获取优先级最低的任务。

猜你喜欢

转载自blog.csdn.net/caicai250/article/details/131441615