Condition条件队列实现一个简单阻塞队列
当队列中元素满了就阻塞生产者线程,当队列为空就阻塞消费者线程。
这里用的是Lock + await() + singal() / signalAll()
也可以使用synchronized + wait() + notify()/ notifyAll()
import java.util.LinkedList;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.ReentrantLock;
public class BlockingQueuqLock<T> {
private LinkedList<T> queue = new LinkedList<>(); //使用LinkedList作为队列
private ReentrantLock lock = new ReentrantLock();
private Condition product = lock.newCondition(); //生产者Condition
private Condition consumer = lock.newCondition(); //消费者Condition
private static final int MAX = 10; //规定队列中最多有10个元素
public void put(T t) throws InterruptedException {
lock.lock();
try {
while (queue.size() == MAX) {
//while循环 队列元素满了 就阻塞
product.await();
}
queue.add(t);
consumer.signalAll(); //队列中有元素 唤醒消费者等待队列中的所有线程
} finally {
lock.unlock();
}
}
public T get() throws InterruptedException {
lock.lock();
try {
while (queue.size() == 0) {
//队列为空 阻塞消费者线程
consumer.await();
}
T res = queue.removeFirst();
product.signalAll(); //唤醒生产者等待队列中的所有线程
return res;
} finally {
lock.unlock();
}
}
}