package com.interview.basics.java.cocurrency.blocking; import com.interview.basics.model.collection.queue.FixCapabilityArrayQueue; import java.util.concurrent.locks.Condition; import java.util.concurrent.locks.ReentrantLock; /** * Created with IntelliJ IDEA. * User: stefanie * Date: 10/24/14 * Time: 11:17 AM */ public class BlockingQueueUsingLock<T> extends FixCapabilityArrayQueue<T> implements BlockingQueue<T> { public ReentrantLock lock; public Condition full; public Condition empty; public BlockingQueueUsingLock(int N){ super(N); lock = new ReentrantLock(); full = lock.newCondition(); empty = lock.newCondition(); } @Override public void add(T item) throws InterruptedException { final ReentrantLock lock = this.lock; lock.lockInterruptibly(); try { while(size >= N){ System.out.println("Queue is full"); full.await(); } super.push(item); empty.signal(); } catch (InterruptedException e) { e.printStackTrace(); } finally { lock.unlock(); } } @Override public T take() throws InterruptedException { final ReentrantLock lock = this.lock; lock.lockInterruptibly(); try { while(size == 0){ empty.await(); } T element = super.pop(); full.signal(); return element; } catch (InterruptedException e) { e.printStackTrace(); return null; } finally { lock.unlock(); } } }