ReentrantLock 实现阻塞队列 BlockingQueue
import lombok.extern.slf4j.Slf4j;
import java.util.LinkedList;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.ReentrantLock;
@Slf4j
public class BlockingQueue<T> {
private LinkedList<T> queue = new LinkedList<>();
private final ReentrantLock LOCK = new ReentrantLock();
private final Condition fullWaitSet = LOCK.newCondition();
private final Condition emptyWaitSet = LOCK.newCondition();
private int capacity;
public T poll(long timeout, TimeUnit timeUnit) {
LOCK.lock();
try {
long nanos = timeUnit.toNanos(timeout);
while (queue.isEmpty()) {
if (nanos <= 0) return null;
try {
nanos = emptyWaitSet.awaitNanos(nanos);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
T t = queue.removeFirst();
fullWaitSet.signal();
return t;
}finally {
LOCK.unlock();
}
}
public T take() {
LOCK.lock();
try {
while (queue.isEmpty()) {
try {
emptyWaitSet.await();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
T t = queue.removeFirst();
fullWaitSet.signal();
return t;
}finally {
LOCK.unlock();
}
}
public void put(T e) {
LOCK.unlock();
try {
while (queue.size() == size()) {
try {
fullWaitSet.await();
} catch (InterruptedException ex) {
ex.printStackTrace();
}
}
queue.addLast(e);
emptyWaitSet.signal();
}finally {
LOCK.unlock();
}
}
public int size() {
LOCK.lock();
try {
return queue.size();
}finally {
LOCK.unlock();
}
}
}