package test;
import java.util.LinkedList;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
public class LinkedBlockingQueue {
private int capacity;
private Lock lock = new ReentrantLock();
private Condition unfull = lock.newCondition();
private Condition unEmpty = lock.newCondition();
private int count;
private LinkedList<Integer> queue;
public LinkedBlockingQueue(int capacity) {
this.capacity = capacity;
queue = new LinkedList<Integer>();
}
public void put(int val) throws InterruptedException {
lock.lock();
try {
while(count == capacity) {
unfull.await();
}
queue.add(val);
count++;
unfull.signal();
} finally {
lock.unlock();
}
}
public int take() throws InterruptedException {
lock.lock();
try {
while(count == 0) {
unEmpty.await();
}
int e = queue.pop();
count--;
unEmpty.signal();
return e;
} finally {
lock.unlock();
}
}
public static void main(String[] args) {
// TODO Auto-generated method stub
}
}