Java PriorityBlockingQueue is a concurrent collection and an implementation of BlockingQueue. PriorityBlockingQueue is an unbounded collection. Ordering of elements in the PriorityBlockingQueue is done same as in PriorityQueue.
We should see PriorityBlockingQueue
as a PriorityQueue
with added operations for blocking retrieval. All the rules of PriorityQueue applies here like elements are ordered based on their priority level among the elements.
Let us have a look at a producer-consumer based example to understand the PriorityBlockingQueue
.
package com.javapapers.java.collections; import java.util.Random; import java.util.UUID; import java.util.concurrent.BlockingQueue; public class PriorityBlockingQueueProducer implements Runnable { protected BlockingQueue<String> blockingQueue; final Random random = new Random(); public PriorityBlockingQueueProducer(BlockingQueue<String> queue) { this.blockingQueue = queue; } @Override public void run() { while (true) { try { String data = UUID.randomUUID().toString(); System.out.println("Put: " + data); blockingQueue.put(data); Thread.sleep(500); } catch (InterruptedException e) { e.printStackTrace(); } } } }
package com.javapapers.java.collections; import java.util.concurrent.BlockingQueue; public class PriorityBlockingQueueConsumer implements Runnable { protected BlockingQueue<String> blockingQueue; public PriorityBlockingQueueConsumer(BlockingQueue<String> queue) { this.blockingQueue = queue; } @Override public void run() { while (true) { try { String data = blockingQueue.take(); System.out.println(Thread.currentThread().getName() + " take(): " + data); Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } } } }
package com.javapapers.java.collections; import java.util.concurrent.BlockingQueue; import java.util.concurrent.LinkedBlockingQueue; public class PriorityBlockingQueueExample { public static void main(String[] args) { final BlockingQueue<String> priorityBlockingQueue = new LinkedBlockingQueue<String>(); PriorityBlockingQueueProducer queueProducer = new PriorityBlockingQueueProducer( priorityBlockingQueue); new Thread(queueProducer).start(); PriorityBlockingQueueConsumer queueConsumer1 = new PriorityBlockingQueueConsumer( priorityBlockingQueue); new Thread(queueConsumer1).start(); PriorityBlockingQueueConsumer queueConsumer2 = new PriorityBlockingQueueConsumer( priorityBlockingQueue); new Thread(queueConsumer2).start(); } }
Put: ebc55884-84d7-4621-b3d7-2e7c9c428a13 Thread-1 take(): ebc55884-84d7-4621-b3d7-2e7c9c428a13 Put: 1f8e4b4e-03df-4068-a2e1-423f1f6091a1 Thread-2 take(): 1f8e4b4e-03df-4068-a2e1-423f1f6091a1 Put: 55a38169-24a1-459b-ad1a-51b0ba36a7b8 Thread-1 take(): 55a38169-24a1-459b-ad1a-51b0ba36a7b8 Put: 84af8597-2796-4050-8c19-711d68f8ce6b Thread-2 take(): 84af8597-2796-4050-8c19-711d68f8ce6b Put: 3cb2bcae-8a71-4d75-96bb-72549ffd6283 Thread-1 take(): 3cb2bcae-8a71-4d75-96bb-72549ffd6283
Comments are closed for "Java PriorityBlockingQueue".
[…] PriorityBlockingQueue […]
final BlockingQueue priorityBlockingQueue = new LinkedBlockingQueue();
should be
final BlockingQueue priorityBlockingQueue = new PriorityBlockingQueue();