阻塞队列支持阻塞的添加和移除操作。、
image.png

记忆阻塞的两个方法

  • offer和poll:不阻塞,都含有 o字母
  • take和put:阻塞,都含有t字母。ting 停,就是阻塞

    Java里的阻塞队列

    第6章 阻塞队列 - 图2
  1. ArrayBlockingQuque
    1. 默认情况下不保证线程公平访问队列
    2. 可以设置公平访问,公平性通过可重入锁实现
  2. LinkedBlockingQueue
    1. 默认和最大长度为Intger.MAX_VALUE
  3. PriorityBlockingQueue
    1. 支持优先级
    2. 无界
  4. DelayQueue

    1. 支持延时获取元素
    2. 无界
    3. 队列中元素必须实现Delayed接口
    4. 应用:定时任务

      如何实现Delayed接口? 可以参考ScheduledFutureTask类实现。

      • 创建对象,初始化数据并使用sequenceNumber标识元素的优先级
      • 实现getDelay方法,方法返回 N 纳秒后执行
      • 实现compareTo方法

      延时阻塞队列怎么实现的?

      • 实现思路就是从队列获取元素,若没达到延时时间就阻塞当前线程
      • leader是一个等待获取队列头部元素的线程(leader是个线程)
      • leader不为空,使用await()方法让当前线程等待消息
      • leader为空,则吧当前线程设置为leader,并使用awaitNanos方法
  5. SynchronousQueue

    1. 不存储任何数据
    2. 看成一个传球手
  6. LinkedTransferQueue
    1. 多了tryTransfer和transfer方法
    2. transfer可以把生产者传入的数据立刻给正在等待的消费者。会一直等
    3. tryTransfer会立即返回,可以指定时间
  7. LinkedBlockingDeque
    1. 双端阻塞队列
    2. 无界
    3. 可以应用在“工作窃取”模式中

      阻塞队列的实现原理

      通过两个Condition来实现。