队列
队列继承关系
BlockingQueue队列
BlockingQueue基本增删操作
抛出异常 | 特殊值 | 阻塞 | 超时 | |
---|---|---|---|---|
插入 | add(e) | offer(e) | put(e) | offer(e, time, unit) |
移除 | remove() | poll() | take() | poll(time, unit) |
检查 | element() | peek() | 不可用 | 不可用 |
详细介绍
- add(E e):把 e 加到 BlockingQueue 里,即如果 BlockingQueue 可以容纳,则返回 true,否则报异常
- offer(E e):表示如果可能的话,将 e 加到 BlockingQueue 里,即如果 BlockingQueue 可以容纳,则返回 true,否则返回 false
- put(E e):把 e 加到 BlockingQueue 里,如果 BlockQueue 没有空间,则调用此方法的线程被阻断直到 BlockingQueue 里面有空间再继续
- poll(time):取走 BlockingQueue 里排在首位的对象,若不能立即取出,则可以等 time 参数规定的时间,取不到时返回 null
- take():取走 BlockingQueue 里排在首位的对象,若 BlockingQueue 为空,阻断进入等待状态直到 Blocking 有新的对象被加入为止
ArrayBlockingQueue
介绍
ArrayBlockingQueue是一个阻塞式的队列,继承自AbstractBlockingQueue,间接的实现了Queue接口和Collection接口,实现了Serializable接口说明ArrayBlockingQueue是有序的。底层以数组的形式保存数据(实际上可看作一个循环数组)。常用的操作包括 add,offer,put,remove,poll,take,peek。
根据 ArrayBlockingQueue 的名字我们都可以看出,它是一个队列,并且是一个基于数组的阻塞队列。
ArrayBlockingQueue 是一个有界队列,有界也就意味着,它不能够存储无限多数量的对象。所以在创建 ArrayBlockingQueue 时,必须要给它指定一个队列的大小。
对于元素的入队列和出队列使用的是同一个lock对象。(源码110行)
我们先来熟悉一下 ArrayBlockingQueue 中的几个重要的方法。
- remainingCapacity():剩余可用的大小。等于初始容量减去当前的 size
- size():当前对列中元素数量
ArrayBlockingQueue 使用场景。
- 先进先出队列(队列头的是最先进队的元素;队列尾的是最后进队的元素)
- 有界队列(即初始化时指定的容量,就是队列最大的容量,不会出现扩容,容量满,则阻塞进队操作;容量空,则阻塞出队操作)
- 队列不支持空元素
LinkedBlockingQueue
介绍
LinkedBlockingQueue是一个阻塞队列,其大小的配置是可选的,如果我们初始化时指定一个大小,它就是有边界的,如果不指定,它就是无边界的。说是无边界,其实是采用了默认大小为Integer.MAX_VALUE的容量 。
继承自AbstractBlockingQueue,间接的实现了Queue接口和Collection接口,实现了Serializable接口说明LinkedBlockingQueue是有序的。底层以单向链表的形式保存数据。常用的操作包括 add,offer,put,remove,poll,take,peek。
与ArrayBlockingQueue一样,LinkedBlockingQueue 也是以先进先出的方式存储数据,最新插入的对象是尾部,最新移出的对象是头部
LinkedBlockingQueue入队列和出队列使用的是两个不同的lock对象,所以在多个CPU的情况下,它们可以做到真正的在同一时刻既消费、又生产,能够做到并行处理。故LinkedBlockingQueue的吞吐量要高于ArrayBlockingQueue。(源码154行)
我们先来熟悉一下 ArrayBlockingQueue 中的几个重要的方法。
- remainingCapacity():剩余可用的大小。等于初始容量减去当前的 size
- size():当前对列中元素数量
LinkedBlockingQueue使用场景。
-
先进先出队列(队列头的是最先进队的元素;队列尾的是最后进队的元素)
-
可以是有界队列(即初始化时指定的容量,就是队列最大的容量,不会出现扩容,容量满,则阻塞进队操作;容量空,则阻塞出队操作)也可以是无界队列(其实是采用了默认大小为Integer.MAX_VALUE的容量 )。
-
队列不支持空元素
priorityBlockingQueue
是一个无界队列,它没有限制,在内存允许的情况下可以无限添加元素;它又是具有优先级的队列,是通过构造函数传入的对象来判断,传入的对象必须实现comparable/comparator接口