進階篇:優先順序佇列之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則是優先順序最高的元素最先被取出...
這先都比較簡單,就不用多說啥了吧....