public class LockCondition<T> {
Lock lock = new ReentrantLock();
Condition notFull = lock.newCondition();
Condition notEmpty = lock.newCondition();
T[] items = (T[]) new Object[100];
int putptr;
int takeptr;
int count;
public void put(T x) throws InterruptedException {
lock.lock();
try {
while (count == items.length) {
notFull.await();
}
items[putptr] = x;
if (++putptr == items.length) {
putptr = 0;
}
++count;
notEmpty.signalAll();
} finally {
lock.unlock();
}
}
public T take() throws InterruptedException {
lock.lock();
try {
while (count == 0)//如果队列为空
{
notEmpty.await();//阻塞读线程
}
T x = items[takeptr];//取值
if (++takeptr == items.length) {
takeptr = 0;//如果读索引读到队列的最后一个位置了,那么置为0
}
--count;//个数--
notFull.signal();//唤醒写线程
return x;
} finally {
lock.unlock();
}
}
}