1. 程式人生 > >進階篇:優先順序佇列之PriorityBlockingQueue(十五)

進階篇:優先順序佇列之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<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則是優先順序最高的元素最先被取出...

這先都比較簡單,就不用多說啥了吧....