参考文献

什么是队列

  • 队列是一种特殊的线性表;
  • 特殊之处在于,它只允许在表的前端(Front)进行删除操作,在表的后端(Rear)进行插入操作;
  • 和栈一样是一种操作受限的线性表;
  • 是一种先进先出(FIFO的数据结构;

什么是阻塞队列

  • 当队列为空时,消费者挂起,队列已满是,生产者挂起,这就是生产者-消费者模型,阻塞就是将线程挂起.若生产者的生产速度和消费者速度之间不匹配,就可以通过阻塞队列让速度快的暂时阻塞.
  • 阻塞队列会通过挂起的方式来实现生产者和消费者之间的平衡,这是和普通队列最大的区别;

Java中的阻塞队列java.util.concurrent.BlockingQueue

Throws Exception Special Value Blocks Times Out
Insert add(e) offer(e) put(e) offer(e,time,unit)
Remove remove(e) poll() take() poll(time,unit)
Examine element() peek()
  • offer(E e): 若队列没满,返回true,如果队列已满,返回false(不阻塞);
  • offer(E e,long timeout,TimeUnit unit): 可以设置等待时间,若队列没满,则进行等待,超过等待时间,则返回false(不阻塞);
  • put(E e): 无返回值,一直等待,直至队列空出位置;
  • poll(): 若有数据,出队,若没有数据,返回null;
  • poll(long timeout,TimeUnit unit): 可以设置等待时间,若没有数据,则等待,超过等待时间,则返回null;
  • take(): 若有数据,出队,若没有数据,一直等待;
BlockingQueue主要实现类
  • ArrayBlockingQueue
    • 基于数组实现的,通过初始化时设置数组长度,是一个有界队列;
  • LinkedBlockingQueue
    • 基于链表实现,大小可以初始化设置,若不设置默认为Integer.MAX_VALUE
  • DelayQueue
    • 基于优先级的一个无界队列,队列元素必须实现Delayed接口,支持延迟获取,元素按照时间排序,只有元素到期后,消费者才能从队列中取出;
  • PriorityBlockingQueue
    • 基于优先级的一个无界队列,底层是基于数组存储元素,元素按照优先级顺序存储,优先级是通过ComparablecompareTo方法实现(自然排序),和其他阻塞队列不同的是,其只会阻塞消费者,不会则是生产者,数组会不断扩容;
  • SynchronousQueue
    • 是一个特殊的队列,其内部没有容器,所以生产者必须生成一个数据,生产者才能再次生成;