PriorityBlockingQueue无界的优先级阻塞队列
无界的优先级阻塞队列,内部使用数组存储数据,达到容量时,会自动进行扩容,放入的元素会按照优先级进行排序,4个构造方法:
//默认构造方法,默认初始化容量是11
public PriorityBlockingQueue();
//指定队列的初始化容量
public PriorityBlockingQueue(int initialCapacity);
//指定队列的初始化容量和放入元素的比较器
public PriorityBlockingQueue(int initialCapacity,Comparator<? super E> comparator);
//传入集合放入来初始化队列,传入的集合可以实现SortedSet接口或者PriorityQueue接口进行排序,如果没有实现这2个接口,按正常顺序放入队列
public PriorityBlockingQueue(Collection<? extends E> c);
优先级队列放入元素的时候,会进行排序,所以我们需要指定排序规则,有2种方式:
创建PriorityBlockingQueue指定比较器Comparator
放入的元素需要实现Comparable接口
上面2种方式必须选一个,如果2个都有,则走第一个规则排序。
demo:
package com...Queue.PriorityBlockingQueue; import java.util.concurrent.PriorityBlockingQueue; import java.util.concurrent.TimeUnit; public class PriorityBlockingQueues { //推送信息封装 static class Msg implements Comparable<Msg> { //优先级,越小优先级越高 private int priority; //推送的信息 private String msg; public Msg(int priority, String msg) { this.priority = priority; this.msg = msg; } @Override public int compareTo(Msg o) { return Integer.compare(this.priority, o.priority); } @Override public String toString() { return "Msg{" + "priority=" + priority + ", msg='" + msg + '\'' + '}'; } } //推送队列 static PriorityBlockingQueue<Msg> pushQueue = new PriorityBlockingQueue<Msg>(); static { //启动一个线程做真实推送 new Thread(() -> { while (true) { Msg msg; try { long starTime = System.currentTimeMillis(); //获取一条推送消息,此方法会进行阻塞,直到返回结果 msg = pushQueue.take(); //模拟推送耗时 TimeUnit.MILLISECONDS.sleep(100); long endTime = System.currentTimeMillis(); System.out.println(String.format("[%s,%s,take耗时:%s],%s,发送消息:%s", starTime, endTime, (endTime - starTime), Thread.currentThread().getName(), msg)); } catch (InterruptedException e) { e.printStackTrace(); } } }).start(); } //推送消息,需要发送推送消息的调用该方法,会将推送信息先加入推送队列 public static void pushMsg(int priority, String msg) throws InterruptedException { pushQueue.put(new Msg(priority, msg)); } public static void main(String[] args) throws InterruptedException { for (int i = 5; i >= 1; i--) { String msg = "数据推送,第" + i + "条"; System.out.println(msg); PriorityBlockingQueues.pushMsg(i, msg); } } }