標籤:線程 thread java priorityblockingqueu
java PriorityBlockingQueue 基礎的優先順序隊列,可阻塞的讀取操作.
package org.rui.thread.newc;import java.util.ArrayList;import java.util.List;import java.util.Queue;import java.util.Random;import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;import java.util.concurrent.PriorityBlockingQueue;import java.util.concurrent.TimeUnit;/*** * 這是一個基於優選級隊列,它具有可阻塞的讀取操作。 * 下面是一個樣本,其中在優級級隊列的對象是按照優級級順序從隊列中出現的任務。 * prioritizedTask被賦予了一個優先順序數字, 以此來提供這種順序。 * @author lenovo * */class PrioritizedTask implements Runnable, Comparable<PrioritizedTask>{private Random rand = new Random(47);private static int counter = 0;private final int id = counter++;private final int priority;protected static List<PrioritizedTask> sequence = new ArrayList<PrioritizedTask>();public PrioritizedTask(int priority){this.priority = priority;sequence.add(this);}@Overridepublic int compareTo(PrioritizedTask o){return priority < o.priority ? 1 : (priority > o.priority ? -1 : 0);}@Overridepublic void run(){try{TimeUnit.MILLISECONDS.sleep(rand.nextInt(250));} catch (InterruptedException e){// Acceptable way to exit 可接受的方式退出}System.out.println("PrioritizedTask run: " + this);}@Overridepublic String toString(){return String.format("[%1$-3d]", priority) + " =Task >>id: " + id;}public String summary(){return "(id:" + id + " priority:" + priority + ")";}// //public static class endSentinel extends PrioritizedTask{private ExecutorService exec;public endSentinel(ExecutorService e){super(-1);// lowest priority in this program 最低優先順序exec = e;}@Overridepublic void run(){int count = 0;for (PrioritizedTask pt : sequence){System.out.println("summary匯總: "+pt.summary());if (++count % 5 == 0){System.out.println();}}System.out.println();System.out.println(this + " calling shutdownNow");exec.shutdownNow();}}}// //////////////生產者////////class prioritizedTaskProducer implements Runnable{private Random rand = new Random(47);private Queue<Runnable> queue;private ExecutorService exec;public prioritizedTaskProducer(Queue<Runnable> q, ExecutorService e){queue = q;exec = e;// used for end sentinel 用於結束哨兵}@Overridepublic void run(){// unbounded queue ; never blocks 無界隊列;從不阻塞// fill it up fast with random priorities 把它填平快速隨機的優先順序for (int i = 0; i < 20; i++){int temp=0;System.out.println("入隊列>>隨機20>>10>inner:"+(temp=rand.nextInt(10)));queue.add(new PrioritizedTask(temp));Thread.yield();// 讓當前線程回到可執行狀態,以便讓具有相同優先順序的線程進入執行狀態,但不是絕對的。因為虛擬機器可能會讓該線程重新進入執行狀態。}// trickle in highest-priority jobs 細流在最高優先順序的工作try{//放入10 個10for (int i = 0; i < 10; i++){System.out.println("入隊列>>指定10>>10個:"+10);TimeUnit.MILLISECONDS.sleep(2500);queue.add(new PrioritizedTask(10));}for (int i = 0; i < 10; i++){System.out.println("入隊列>>自增>>10>0-10:"+i);// add jobs lowest priority first: 添加工作 最低優先順序:queue.add(new PrioritizedTask(i));}// a sentinel to stop all the tasks 哨兵停止所有的任務queue.add(new PrioritizedTask.endSentinel(exec));} catch (InterruptedException e){// 可接受的方式退出System.out.println("InterruptedException >>143");}System.out.println("完成 prioritizedTaskProducer");}}// //消費者////PriorityBlockingQueue/////////class prioritizedTaskConsumer implements Runnable{private PriorityBlockingQueue<Runnable> q;public prioritizedTaskConsumer(PriorityBlockingQueue<Runnable> q){this.q = q;}@Overridepublic void run(){try{while (!Thread.interrupted()){// use current thread to run the task 使用當前線程啟動並執行任務q.take().run();}} catch (InterruptedException e){// acceptable way to exit}System.out.println("完成 prioritizedTaskConsumer");}}/*** * main * @author lenovo * */public class PriorityBlockingQueueDemo{public static void main(String[] args) throws InterruptedException{Random randx = new Random(47);int c = randx.nextInt(250);System.out.println(c);ExecutorService exec = Executors.newCachedThreadPool();PriorityBlockingQueue<Runnable> queue = new PriorityBlockingQueue<Runnable>();exec.execute(new prioritizedTaskProducer(queue, exec));// 生產者 //Thread.sleep(8000);exec.execute(new prioritizedTaskConsumer(queue));// 消費者}}/**output:sle---入隊列>>隨機20>>10>inner:8入隊列>>隨機20>>10>inner:5入隊列>>隨機20>>10>inner:3入隊列>>隨機20>>10>inner:1入隊列>>隨機20>>10>inner:1入隊列>>隨機20>>10>inner:9入隊列>>隨機20>>10>inner:8入隊列>>隨機20>>10>inner:0入隊列>>隨機20>>10>inner:2入隊列>>隨機20>>10>inner:7入隊列>>隨機20>>10>inner:8入隊列>>隨機20>>10>inner:8入隊列>>隨機20>>10>inner:1入隊列>>隨機20>>10>inner:9入隊列>>隨機20>>10>inner:9入隊列>>隨機20>>10>inner:8入隊列>>隨機20>>10>inner:8入隊列>>隨機20>>10>inner:1入隊列>>隨機20>>10>inner:0入隊列>>隨機20>>10>inner:8入隊列>>指定10>>10個:10入隊列>>指定10>>10個:10入隊列>>指定10>>10個:10入隊列>>指定10>>10個:10PrioritizedTask run: [10 ] =Task >>id: 20PrioritizedTask run: [10 ] =Task >>id: 21PrioritizedTask run: [10 ] =Task >>id: 22PrioritizedTask run: [9 ] =Task >>id: 5PrioritizedTask run: [9 ] =Task >>id: 13PrioritizedTask run: [9 ] =Task >>id: 14PrioritizedTask run: [8 ] =Task >>id: 15PrioritizedTask run: [8 ] =Task >>id: 16PrioritizedTask run: [8 ] =Task >>id: 19PrioritizedTask run: [8 ] =Task >>id: 0PrioritizedTask run: [8 ] =Task >>id: 10PrioritizedTask run: [8 ] =Task >>id: 11PrioritizedTask run: [8 ] =Task >>id: 6PrioritizedTask run: [7 ] =Task >>id: 9PrioritizedTask run: [5 ] =Task >>id: 1PrioritizedTask run: [3 ] =Task >>id: 2PrioritizedTask run: [2 ] =Task >>id: 8PrioritizedTask run: [1 ] =Task >>id: 12PrioritizedTask run: [1 ] =Task >>id: 17PrioritizedTask run: [1 ] =Task >>id: 4PrioritizedTask run: [1 ] =Task >>id: 3PrioritizedTask run: [0 ] =Task >>id: 7PrioritizedTask run: [0 ] =Task >>id: 18入隊列>>指定10>>10個:10PrioritizedTask run: [10 ] =Task >>id: 23入隊列>>指定10>>10個:10PrioritizedTask run: [10 ] =Task >>id: 24入隊列>>指定10>>10個:10PrioritizedTask run: [10 ] =Task >>id: 25入隊列>>指定10>>10個:10PrioritizedTask run: [10 ] =Task >>id: 26入隊列>>指定10>>10個:10PrioritizedTask run: [10 ] =Task >>id: 27入隊列>>指定10>>10個:10PrioritizedTask run: [10 ] =Task >>id: 28入隊列>>自增>>10>0-10:0入隊列>>自增>>10>0-10:1入隊列>>自增>>10>0-10:2入隊列>>自增>>10>0-10:3入隊列>>自增>>10>0-10:4入隊列>>自增>>10>0-10:5入隊列>>自增>>10>0-10:6入隊列>>自增>>10>0-10:7入隊列>>自增>>10>0-10:8入隊列>>自增>>10>0-10:9完成 prioritizedTaskProducerPrioritizedTask run: [10 ] =Task >>id: 29PrioritizedTask run: [9 ] =Task >>id: 39PrioritizedTask run: [8 ] =Task >>id: 38PrioritizedTask run: [7 ] =Task >>id: 37PrioritizedTask run: [6 ] =Task >>id: 36PrioritizedTask run: [5 ] =Task >>id: 35PrioritizedTask run: [4 ] =Task >>id: 34PrioritizedTask run: [3 ] =Task >>id: 33PrioritizedTask run: [2 ] =Task >>id: 32PrioritizedTask run: [1 ] =Task >>id: 31PrioritizedTask run: [0 ] =Task >>id: 30summary匯總: (id:0 priority:8)summary匯總: (id:1 priority:5)summary匯總: (id:2 priority:3)summary匯總: (id:3 priority:1)summary匯總: (id:4 priority:1)summary匯總: (id:5 priority:9)summary匯總: (id:6 priority:8)summary匯總: (id:7 priority:0)summary匯總: (id:8 priority:2)summary匯總: (id:9 priority:7)summary匯總: (id:10 priority:8)summary匯總: (id:11 priority:8)summary匯總: (id:12 priority:1)summary匯總: (id:13 priority:9)summary匯總: (id:14 priority:9)summary匯總: (id:15 priority:8)summary匯總: (id:16 priority:8)summary匯總: (id:17 priority:1)summary匯總: (id:18 priority:0)summary匯總: (id:19 priority:8)summary匯總: (id:20 priority:10)summary匯總: (id:21 priority:10)summary匯總: (id:22 priority:10)summary匯總: (id:23 priority:10)summary匯總: (id:24 priority:10)summary匯總: (id:25 priority:10)summary匯總: (id:26 priority:10)summary匯總: (id:27 priority:10)summary匯總: (id:28 priority:10)summary匯總: (id:29 priority:10)summary匯總: (id:30 priority:0)summary匯總: (id:31 priority:1)summary匯總: (id:32 priority:2)summary匯總: (id:33 priority:3)summary匯總: (id:34 priority:4)summary匯總: (id:35 priority:5)summary匯總: (id:36 priority:6)summary匯總: (id:37 priority:7)summary匯總: (id:38 priority:8)summary匯總: (id:39 priority:9)summary匯總: (id:40 priority:-1)[-1 ] =Task >>id: 40 calling shutdownNow完成 prioritizedTaskConsumer*//***與前一個樣本相同,prioritizedTask對象的建立序列被記錄在sequence list中,用於和實際的執行順序比較。*run()方法將休眠一小段隨機的時間 ,然後列印對象資訊,而EndSentinel提供了和前面相同的功能,*要確保它是隊列中最後一個對象。**PrioritizedTaskProducer和PrioritizedTaskComsumer通過PriorityBlockingQueue彼此串連。*因為這種隊列的阻塞特性提供了所有必需的同步,所以你應該注意到了,這裡不需要任何顯式的同步--不必考慮你從這種隊列中讀取時*,基中是否有無素,因為這個隊列在沒有元素時,將直接阻塞讀取者。***/
java PriorityBlockingQueue 基礎的優先順序隊列,可阻塞的讀取操作.