BlockingQueue
當生產者線程試圖向BlockingQueue中放入元素時,如果該隊列已滿,則該線程被阻塞,對應put方法;
當消費者線程試圖從BlockingQueue中取出元素時,如果該隊列已空,則該線程被阻塞,對應take方法。
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
class BlockingQueue
{
//顯示定義一個可重入鎖
final Lock lock = new ReentrantLock();
//獲得指定lock對象的condition
final Condition notFull = lock.newCondition();
final Condition notEmpty = lock.newCondition();
//定義一個Object數組
final Object[] items = new Object[100];
//定義一些標識變量
int putptr, takeptr, count;
//向隊列中放元素
public void put(Object o) throws InterruptedException
{
lock.lock();//加鎖
try
{
while(count == items.length)//若隊列滿,則阻塞非滿線程
{
notFull.await();
}
items[putptr++] = o;//否則將元素加入數組中
if(putptr == items.length)//若隊列滿,則將put標識清0
{
putptr = 0;
}
count++;//隊列中元素的個數自增
notEmpty.signal();//喚醒非空線程
}
finally
{
lock.unlock();//釋放鎖
}
}
//從隊列中取元素
public Object take() throws InterruptedException
{
lock.lock();//加鎖
try
{
while(count == 0)//若隊列空,則阻塞非空線程
{
notEmpty.await();
}
Object o = items[takeptr++];//將數組中的元素存入Object變量
if(takeptr == items.length)//若隊列變空,則將take標識清0
{
takeptr = 0;
}
count--;//數組元素個數自減
notFull.signal();//喚醒非滿線程
return o;//返回需要取出的元素
}finally
{
lock.unlock();//釋放鎖
}
}
}