$ Java并发集合框架

$ 队列

$ Queue接口

抛出异常 返回特定值
插入 add(e) offer(e)
删除 remove() poll()
检查 element() peek()

$ BlockingQueue接口

抛出异常 返回特定值 阻塞 超时
插入 add(e) offer(e) put(e) offer(e, time, unit)
删除 remove() poll() take() poll(time, unit)
检查 element() peek() / /

当阻塞队列不可用时,会有四种相应的处理方式:

  • 返回特殊值:插入元素时,会返回是否插入成功,成功返回true。如果是移除方法,则是从队列中取出一个元素,没有则返回null。
  • 一直阻塞:当阻塞队列满时,如果生产者线程往队列里面 put 元素,则生产者线程会被阻塞,知道队列不满或者响应中断退出。当队列为空时,如果消费者线程从队列里 take 元素。
  • 超时退出:当阻塞队列满时,如果生产者线程往队列里插入元素,队列会阻塞生产者线程一段时间,如果超过了指定时间,生产者线程就会退出。

如果是无界阻塞队列,队列则不会出现满的情况。

JDK7提供了7个阻塞队列。分别是

  • ArrayBlockingQueue :一个由数组结构组成的有界阻塞队列。
  • LinkedBlockingQueue :一个由链表结构组成的有界阻塞队列。
  • PriorityBlockingQueue :一个支持优先级排序的无界阻塞队列。
  • DelayQueue:一个使用优先级队列实现的无界阻塞队列。
  • SynchronousQueue:一个不存储元素的阻塞队列。
  • LinkedTransferQueue:一个由链表结构组成的无界阻塞队列。
  • LinkedBlockingDeque:一个由链表结构组成的双向阻塞队列。

所谓公平访问队列是指阻塞的所有生产者线程或消费者线程,当队列可用时,可以按照阻塞的先后顺序访问队列,即先阻塞的生产者线程,可以先往队列里插入元素,先阻塞的消费者线程,可以先从队列里获取元素

名称 界限 特性
ArrayBlockingQueue 基于数组的并发阻塞队列 有界 数组, FIFO,
必须设置长度,
默认不公平
LinkedBlockingQueue 基于链表的FIFO阻塞队列 有界 链表, FIFO,没有指定长度
PriorityBlockingQueue 带优先级的无界阻塞队列 无界 支持优先级排序
DelayQueue 延期阻塞队列 无界 优先级队列实现,没有指定长度
SynchronousQueue 并发同步阻塞队列 有界 不存储元素,不能指定长度
LinkedTransferQueue 无界 链表
LinkedBlockingDeque 基于链表的FIFO双端阻塞队列 有界 链表,双向,没有指定长度

$ ArrayBlockingQueue

此队列按照先进先出(FIFO)的原则对元素进行排序

默认情况下不保证线程公平地访问队列(所谓公平是指当队列可用时,先被阻塞的线程先访问队列)

为了保证公平性通常会降低吞吐量。

公平锁是利用了可重入锁的公平锁来实现。

$ ArrayBlockingQueue

此队列按照先进先出(FIFO)的原则对元素进行排序

默认长度为 Integer.MAX_VALUE

$ PriorityBlockingQueue

默认情况下元素采取自然顺序升序排列

可以自定义 Comparator 或者自定义类实现 compareTo() 方法来指定排序规则

不支持同优先级元素排序

$ DelayQueue

队列使用 PriorityQueue 来实现,队列中的元素必须实现 Delayed 接口

只有在延时期满才能从队列中提取元素

$ CopyOnWriteArrayList

$ 参考

Java中Lock,tryLock,lockInterruptibly有什么区别? (opens new window)

更新时间: 4/12/2020, 11:05:44 AM