Example of BlockingDeque in Java
December 29, 2013
java.util.concurrent.BlockingDeque has been introduced in JDK 6 and is the part of collection framework. BlockingDeque is a deque collection which supports blocking operation. Deque is a queue that supports insertion and deletion at both sides. BlockingDeque means while insertion, it waits to become empty if already full and while deletion it waits to become non-empty if already empty. There is some interesting method description of BlockingDeque.
Difference among add(), offer() and put() of BlockingDeque in Java
The main feature of BlockingDeque is to wait while inserting or deleting element if necessary. put() guarantees to add element in BlockingDeque, because if there is no space then put() will wait to become empty. add() will not wait if no space and throw IllegalStateException. offer() can be used when we do not want to wait and also do not want to get exception if no space. So offer() simply returns false if got no space immediately or returns true if success.Difference among peek(), poll(), remove(), take(), element() of BlockingDeque in Java
peek() : fetches the element from the head of the queue but does not remove from BlockingDeque.poll() : fetches the element from the head of the queue and remove also from BlockingDeque, returns null if empty.
remove() : fetches the element from the head of the queue and remove also from BlockingDeque, throws NoSuchElementException if empty.
take() : fetches the element from the head of the queue and remove also from BlockingDeque, waits if empty.
element() : fetches the element from the head of the queue but does not remove from BlockingDeque, throws NoSuchElementException if empty.
How to Use BlockingDeque in Java
BlockingDeque is an interface. It has been implemented by java.util.concurrent.LinkedBlockingDeque.BlockingDeque<E> lbd=new LinkedBlockingDeque<E>();
BlockingDequeDemo.java
package com.concretepage.concurrent; import java.util.concurrent.BlockingDeque; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.LinkedBlockingDeque; public class BlockingDequeDemo { static BlockingDeque<String> bd=new LinkedBlockingDeque<String>(1); public static void main(String[] args) { ExecutorService exService = Executors.newFixedThreadPool(2); BlockingDequeDemo bdeque = new BlockingDequeDemo(); ElementAdd elementAdd = bdeque.new ElementAdd(); ElementGet elementGet = bdeque.new ElementGet(); exService.execute(elementAdd); exService.execute(elementGet); exService.shutdown(); } class ElementAdd implements Runnable{ @Override public void run() { for(;;){ try { String s= bd.take(); System.out.println("Element received is: "+s); } catch (InterruptedException e) { e.printStackTrace(); } } } } class ElementGet implements Runnable{ @Override public void run() { for(int i=0;i < 5;i++){ try { bd.put("A"+i); } catch (InterruptedException e) { e.printStackTrace(); } } } } }
Element received is: A0 Element received is: A1 Element received is: A2 Element received is: A3 Element received is: A4