java PriorityBlockingQueue 基礎的優先順序隊列,可阻塞的讀取操作.

來源:互聯網
上載者:User

標籤:線程   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 基礎的優先順序隊列,可阻塞的讀取操作.

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.