进阶篇:优先级队列之PriorityBlockingQueue(十五)

今天我们来讲下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 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());
		TimeUnit.MILLISECONDS.sleep(1000);
		System.out.println("******开始测试优先级队列******");
		blockingQueue(new PriorityBlockingQueue());
	}


看一下输出:***********************************************************************************************

******开始测试普通阻塞队列******
元素优先级: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则是优先级最高的元素最先被取出...

这先都比较简单,就不用多说啥了吧....


你可能感兴趣的:(多线程与IO专题)