A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

阻塞队列的设计:尽管Java提供封装好的阻塞队列,这里是学习阻塞队列的设计思想


技术要求:1、使用Lock和Condition来实现
          2、使用2个Condition:队列不满和队列不空

技术要点:1、需要一个队列(实质是一个数组)
          2、记录队列的读取位置
          3、记录队列的存放位置
          4、记录队列中元素的个数,以便用来判断队列空或满的状态
          5、队列满时,阻塞存放;若不满了,通知可存放
          、队列空时,阻塞读取;若不空了,通知可读取



class BoundedBuffer{
    final Lock lock = new ReentrantLock();
    final Condition notFull = lock.newConditoin();   //From waking the thread
    final Condition notEnpty = lock.newConditoin();
   
    final Object[] items = new Object[100];
    int putptr, takeptr, count;
   
    public void put(Object obj)throws InterruptedException{
        lock.lock();
        try{
            while(count == items.length) notFull.await();
            items[putptr] = x;
            if(++putptr == itmes.length) putptr = 0;
            ++count;
            notEmpty.signal();   //notEmpty                     
        }finally{
            lock.unlock();
        }        
    }
   
    public Object take()throws InterruptedException{
        lock.lock();
        try{
            while(count == 0) notEmpty.await();
            Object obj = items[takeptr];
            if(++takeptr == items.length) takeptr = 0;
            --count;
            notFull.signal();   //notFull
            retrun obj;
        }finally{
            lock.unlock();
        }        
    }   
}

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马