package com.gf.conn013; import java.util.Iterator; import java.util.concurrent.PriorityBlockingQueue; /** * * PriorityBlockingQueue: 基于优先级的阻塞队列(优先级的判断通过构造函数传入的的Compator对象决定,也就是传入的队列的对象必须实现Comparable接口) * 在实现PriorityBlockiongQueue时,内部控制线程同步的锁采用的是公平锁 * 它也是一个无界队列 * 虽然遍历队列依然是,放入的顺序 ,但是在通过take()方法获取数据时,获取的是通过比较规则排列的数据 * * @author huanchu */ public class UsePriorityBlockingQueue { public static void main(String[] args) throws InterruptedException { PriorityBlockingQueue<Task> q = new PriorityBlockingQueue<Task>(); Task t1 = new Task(); t1.setId(3); t1.setName("任务1 ,id=3"); Task t2 = new Task(); t2.setId(6); t2.setName("任务2 ,id=6"); Task t3 = new Task(); t3.setId(1); t3.setName("任务3 ,id=1"); q.add(t1); q.add(t2); q.add(t3); //直接for循环变量,队列中的元素是不会按我们想要顺序遍历出来 // for (Iterator iterator = q.iterator(); iterator.hasNext();) { // Task task = (Task) iterator.next(); // System.out.println(task.getName()); // // } q.take();//每次取出的元素,则是站在我们的的比较规则排列的顺序,取出元素 } }
package com.gf.conn013; public class Task implements Comparable<Task>{ private int id; private String name; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } @Override public String toString() { return "Task [id=" + id + ", name=" + name + "]"; } @Override public int compareTo(Task task) { return this.id > task.id ? 1 : (this.id < task.id ? -1 : 0); } }
关注我的公众号,精彩内容不能错过