The Java priorityblockingqueue base priority queue, which can block read operations.
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;/*** * This is a preference-based queue that has a blocking read operation. * Below is an example where the objects in the priority queue are the tasks that appear in the queue from the priority order. * Prioritizedtask is given a priority number to provide this order. * @author Lenovo * */class Prioritizedtask implements Runnable, comparable<prioritizedtask>{private Random rand = NE W Random;p rivate static int counter = 0;private final int id = counter++;p rivate final int priority;protected static L Ist<prioritizedtask> sequence = new arraylist<prioritizedtask> ();p ublic 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 can exit the}SYSTEM.OUT.PRINTLN in an acceptable manner ("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 first in the this program lowest priority exec = e;} @Overridepublic void Run () {int count = 0;for (Prioritizedtask pt:sequence) {System.out.println ("Summary rollup:" +pt.summary ()); if (++count% 5 = = 0) {System.out.println ();}} System.out.println (); System.out.println (this + "calling Shutdownnow"); Exec.shutdownnow ();}}} Producer////////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 used to end Sentinel} @Overridepublic void Run () {//unbounded queue; NE Ver blocks unbounded queue; never block/fill it up fast with random priorities to fill it up fast random priority for (int i = 0; i <; i++) {int temp=0; System.out.println ("Into queue >> random 20>>10>inner:" + (Temp=rand.nextint)); Queue.add (New Prioritizedtask (temp)); Thread.yield ();//Let the current thread go back to the executable state, so that threads with the same priority will enter the execution state, but not absolute. Because the virtual machine may cause the thread to re-enter the execution state. }//trickle in highest-priority jobs fine stream in the highest priority work try{//put 10 10for (int i = 0; i < i++) {System.out.println ("into queue >& gt; designation 10>>10: "+10); TimeUnit.MILLISECONDS.sleep (2500); Queue.add (new Prioritizedtask (10));} for (int i = 0; i < i++) {System.out.println ("into queue >> self-increment >>10>0-10:" +i);//Add jobs Lowest priority first : Add work Lowest priority: Queue.add (new Prioritizedtask (i));} A Sentinel to stop all the Tasks Sentinel stops all Task Queue.add (new Prioritizedtask.endsentinel (exec));} catch (Interruptedexception e) {//an acceptable way to exit System.out.println ("InterruptedexceptiOn >>143 ");} System.out.println ("complete Prioritizedtaskproducer");}} Consumer////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 (). run ();} catch (Interruptedexception e) {//acceptable-EXIT}SYSTEM.OUT.PRINTLN ("Completion Prioritizedtaskconsumer");}} /*** * Main * @author Lenovo * */public class Priorityblockingqueuedemo{public static void Main (string[] args) throws Inte Rruptedexception{random randx = new Random (n); 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));//producer//thread.sleep (8000); Exec.execute (New PriorItizedtaskconsumer (queue));//consumer}}/**output:sle---into queue >> random 20>>10>inner:8 into queue >> random 20>> 10>inner:5 into queue >> random 20>>10>inner:3 into queue >> random 20>>10>inner:1 into queue >> random 20>>10 >inner:1 into queue >> random 20>>10>inner:9 into queue >> random 20>>10>inner:8 into queue >> random 20>>10 >inner:0 into queue >> random 20>>10>inner:2 into queue >> random 20>>10>inner:7 into queue >> random 20>>10 >inner:8 into queue >> random 20>>10>inner:8 into queue >> random 20>>10>inner:1 into queue >> random 20>>10 >inner:9 into queue >> random 20>>10>inner:9 into queue >> random 20>>10>inner:8 into queue >> random 20>>10 >inner:8 into queue >> random 20>>10>inner:1 into queue >> random 20>>10>inner:0 into queue >> random 20>>10 >inner:8 into queue >> specify 10>>10:10 into queue >> Specify 10>>10:10 in Queue >> Specify 10>>10:10 in queue >> Specify 10>>10:10PrioritizedTask run: [x] =task >>id:20prioritizedtask run: [Ten] =task >>id:21prioriti Zedtask RUN: [ten] =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:0p Rioritizedtask run: [8] =task >>id:10prioritizedtask run: [8] =task >>id:11prioritizedtask run: [8] =task >>id:6prioritizedtask Run: [7] =task >>id:9prioritizedtask run: [5] =task >>id:1prioriti Zedtask run: [3] =task >>id:2prioritizedtask run: [2] =task >>id:8prioritizedtask run: [1] =task &G T;>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 >>i D:18 into queue >> specify 10>>10:10PrioritizedTask run: [x] =task >>id:23 into queue >> Specify 10>>10:10PrioritizedTask run: [Ten] =task & Gt;>id:24 into queue >> Specify 10>>10:10PrioritizedTask run: [x] =task >>id:25 into queue >> specify 10>>10 : 10PrioritizedTask run: [x] =task >>id:26 into queue >> Specify 10>>10:10PrioritizedTask run: [Ten] =task >> id:27 into queue >> Specify 10>>10:10PrioritizedTask run: [x] =task >>id:28 into queue >> auto-increment >>10> 0-10:0 into queue >> self->>10>0-10:1 into queue >> self-increment >>10>0-10:2 into queue >> Auto->>10>0-10:3 into queue >> self->>10>0-10:4 into queue >> Auto->>10>0-10:5 into queue >> Auto->>10>0-10:6 into queue >> auto-increment >>10>0-10:7 into queue >> self->>10>0-10:8 into queue >> self-increment >>10>0-10:9 complete Prioritizedtaskproducerprioritizedtask run: [Ten] =task >>id:29prioritizedtask run: [9] =task >>id:39pri Oritizedtask 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:32prioritizedt Ask run: [1] =task >>id:31prioritizedtask run: [0] =task >>id:30summary Summary: (id:0 priority:8) Summary Summary : (id:1 Priority:5) Summary summary: (id:2 Priority:3) Summary summary: (Id:3 priority:1) Summary rollup: (Id:4 priority:1) Summary rollup: (ID: 5 Priority:9) Summary summary: (id:6 Priority:8) Summary summary: (id:7 priority:0) Summary rollup: (Id:8 priority:2) Summary rollup: (Id:9 pri Ority:7) Summary Summary: (id:10 Priority:8) Summary summary: (id:11 Priority:8) Summary summary: (id:12 priority:1) Summary summary: (id:13 prior Ity:9) Summary Summary: (id:14 Priority:9) Summary summary: (id:15 Priority:8) Summary summary: (id:16 Priority:8) Summary summary: (id:17 Priorit Y:1) Summary Summary: (id:18 priority:0) Summary summary: (id:19 Priority:8) Summary summary: (id:20 priority:10) Summary summary: (ID:21 priority : Summary Summary: (ID:22 PRIORITY:10) Summary Summary: (id:23 priority:10) Summary summary: (id:24 priority:10) Summary rollup: (id:25 priority:10) Summary rollup: (ID : priority:10) Summary summary: (id:27 priority:10) Summary summary: (id:28 priority:10) Summary summary: (id:29 priority:10) Summary Summary: ( Id:30 priority:0) Summary summary: (id:31 priority:1) Summary rollup: (id:32 priority:2) Summary rollup: (id:33 priority:3) Summary rollup: (ID : priority:4) Summary summary: (id:35 Priority:5) Summary summary: (id:36 Priority:6) Summary summary: (id:37 Priority:7) Summary summary: (id:3 8 Priority:8) Summary summary: (id:39 Priority:9) Summary summary: (id:40 priority:-1) [-1] =task >>id:40 calling Shutdownnow Complete prioritizedtaskconsumer*//*** the same as the previous example, the creation sequence of the Prioritizedtask object is recorded in the sequence list for comparison with the actual execution order. The *run () method sleeps for a short period of time and then prints the object information, while Endsentinel provides the same functionality as before, * to make sure it is the last object in the queue. **prioritizedtaskproducer and Prioritizedtaskcomsumer connect to each other through Priorityblockingqueue. * Because the blocking feature of this queue provides all the necessary synchronizations, you should be aware that there is no need for any explicit synchronization here--regardless of when you read from this queue *, whether there is any element in the base, because this queue will block the reader directly when there are no elements. ***/
The Java priorityblockingqueue base priority queue, which can block read operations.