今天我们来讲下PriorityBlockingQueue这个队列,它是一个优先级队列,什么是优先级呢?意思就是我们可以定义队列中哪个元素可以先被取出!
它与前面介绍的LinkedBlockingQueue不同的地方就是,它是可以定义优先级的!且入队的元素必须实现Comparable接口!
//优先级任务
class PriorityTask implements Runnable,Comparable{
private int priority;
public PriorityTask( int priority ) {
this.priority = priority;
}
@Override
public void run() {
System.out.println("优先级为"+priority+"的任务执行完毕!");
}
@Override
public int compareTo(Object arg) {
PriorityTask task = (PriorityTask)arg;
if(this.priority == task.priority){
return 0;
}
return this.priority>task.priority?1:-1;
}
}
//为了做对比,先看一下普通队列的元素存取顺序,再看一个优先级队列
//结论:LinkedBlockingQueue采用先进先出FIFO的顺序来取元素
//PriorityBlockingQueue里的元素必须实现Comparable接口,它也是先进先出的,只是它已经根据元素的compareTo方法事先排好了序
public static void blockingQueue(final BlockingQueue<PriorityTask> queue) throws InterruptedException{
Random random = new Random();
for (int i = 0; i < 10; i++) {
int priority = random.nextInt(1000);
System.out.println("元素优先级:"+priority);
queue.put( new PriorityTask(priority) );
}
//开启线程消费队列中的任务
new Thread(new Runnable() {
public void run() {
while( !Thread.currentThread().isInterrupted() ){
try {
//取出队列中元素
queue.take().run();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}).start();
}
public static void main(String[] args) throws InterruptedException, BrokenBarrierException {
System.out.println("******开始测试普通阻塞队列******");
blockingQueue(new LinkedBlockingQueue<PriorityTask>());
TimeUnit.MILLISECONDS.sleep(1000);
System.out.println("******开始测试优先级队列******");
blockingQueue(new PriorityBlockingQueue<PriorityTask>());
}
******开始测试普通阻塞队列******
元素优先级:938
元素优先级:320
元素优先级:955
元素优先级:160
元素优先级:105
元素优先级:97
元素优先级:74
元素优先级:21
元素优先级:496
元素优先级:653
优先级为938的任务执行完毕!
优先级为320的任务执行完毕!
优先级为955的任务执行完毕!
优先级为160的任务执行完毕!
优先级为105的任务执行完毕!
优先级为97的任务执行完毕!
优先级为74的任务执行完毕!
优先级为21的任务执行完毕!
优先级为496的任务执行完毕!
优先级为653的任务执行完毕!
******开始测试优先级队列******
元素优先级:460
元素优先级:565
元素优先级:704
元素优先级:104
元素优先级:939
元素优先级:442
元素优先级:419
元素优先级:884
元素优先级:572
元素优先级:687
优先级为104的任务执行完毕!
优先级为419的任务执行完毕!
优先级为442的任务执行完毕!
优先级为460的任务执行完毕!
优先级为565的任务执行完毕!
优先级为572的任务执行完毕!
优先级为687的任务执行完毕!
优先级为704的任务执行完毕!
优先级为884的任务执行完毕!
优先级为939的任务执行完毕!
***********************************************************************************************************
看输出就知道,LinkedBlockingQueue是直接遵循先进先出的顺序,元素一路从上往下被取出,而PriorityBlockingQueue则是优先级最高的元素最先被取出...
这先都比较简单,就不用多说啥了吧....