Java5實現阻塞隊列

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();//釋放鎖
        }
    }   
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章