算法与数据结构-设计有限阻塞队列

设计有限阻塞队列

题目

leetcode原题:1188. 设计有限阻塞队列

实现一个拥有如下方法的线程安全有限阻塞队列:

  • BoundedBlockingQueue(int capacity) 构造方法初始化队列,其中capacity代表队列长度上限。
  • void enqueue(int element) 在队首增加一个element. 如果队列满,调用线程被阻塞直到队列非满。
  • int dequeue() 返回队尾元素并从队列中将其删除. 如果队列为空,调用线程被阻塞直到队列非空。
  • int size() 返回当前队列元素个数。

解析

阻塞队列,首先想到要使用ReetrantLock来实现锁,同时需要使用lock来创建两个的等待条件,一个是非空一个是非满,生产者线程等待非满条件入队,消费者线程等待非空条件出队。同时题目需求,入队在队首,出队在队尾,可以选择使用LinkList中的addFirst和removeLast来实现。

这样大框架就出来了。

代码

class BoundedBlockingQueue {

    private LinkedList<Integer> innerQueue;
    private int capacity;

    private ReentrantLock lock = new ReentrantLock();
    private Condition notFull = lock.newCondition();
    private Condition notEmpty = lock.newCondition();

    public BoundedBlockingQueue(int capacity) {
        innerQueue = new LinkedList<Integer>();
        this.capacity = capacity;
    }
    
    public void enqueue(int element) throws InterruptedException {
        try{
            lock.lockInterruptibly();
            while(size() == capacity){
                notFull.await();
            }
            innerQueue.addFirst(element);
            notEmpty.signalAll();
        }finally{
            lock.unlock();
        }
    }
    
    public int dequeue() throws InterruptedException {
        try{
            lock.lockInterruptibly();
             while(size() == 0){
                notEmpty.await();
            }
            int result = innerQueue.removeLast();
            notFull.signalAll();
            return result;
        }finally{
            lock.unlock();
        }
    }
    
    public int size() {
        try{
            lock.lock();
            return innerQueue.size();
        }finally{
            lock.unlock();
        }
    }
}
posted @ 2021-01-06 10:30  Ging  阅读(417)  评论(0编辑  收藏  举报