阻塞队列有哪些
- ArrayBlockingQueue:是一个基于数组结构的有界阻塞队列,此队列按 FIFO(先进先出)对元素进行排序。
- LinkedBlokcingQueue:是一个基于链表结构的阻塞队列,此队列按 FIFO(先进先出)对元素进行排序,吞吐量通常要高于 ArrayBlockingQueue。
- SynchronousQueue:是一个不存储元素的阻塞队列,每个插入操作必须等到另一个线程调用移除操作,否则插入操作一直处于阻塞状态,吞吐量通常要高于 LinkedBlokcingQueue。
什么是阻塞队列
- 阻塞队列,顾名思义,首先它是一个队列,而一个阻塞队列在数据结构中所起的作用大致如图所示:
- 当阻塞队列是空时,从队列中获取元素的操作将会被阻塞。
-
当阻塞队列是满时,往队列里添加元素的操作将会被阻塞。
-
核心方法
| 方法\行为 | 抛异常 | 特定的值 | 阻塞 | 超时 |
| :——-: | :——-: | :—————: | :—-: | :————————-: |
| 插入方法 | add(o) | offer(o) | put(o) | offer(o, timeout, timeunit) |
| 移除方法 | | poll()、remove(o) | take() | poll(timeout, timeunit) |
| 检查方法 | element() | peek() | | | -
行为解释:
-
抛异常:如果操作不能马上进行,则抛出异常
-
特定的值:如果操作不能马上进行,将会返回一个特殊的值,一般是 true 或者 false
-
阻塞:如果操作不能马上进行,操作会被阻塞
-
超时:如果操作不能马上进行,操作会被阻塞指定的时间,如果指定时间没执行,则返回一个特殊值,一般是 true 或者 false
-
-
插入方法:
- add(E e):添加成功返回true,失败抛 IllegalStateException 异常
- offer(E e):成功返回 true,如果此队列已满,则返回 false
- put(E e):将元素插入此队列的尾部,如果该队列已满,则一直阻塞
-
删除方法:
- remove(Object o) :移除指定元素,成功返回true,失败返回false
- poll():获取并移除此队列的头元素,若队列为空,则返回 null
- take():获取并移除此队列头元素,若没有元素则一直阻塞
-
检查方法:
- element() :获取但不移除此队列的头元素,没有元素则抛异常
- peek() :获取但不移除此队列的头;若队列为空,则返回 null