1. 概述
相比平时讨论的队列,阻塞队列增加了阻塞的功能:
- 当有限长度的队列填满了数据时,继续往队列添加数据的线程将被阻塞住,持续等待,直到超时或队列数据被消费而腾出空间
- 当队列数据为空时,消费线程会因为取不到数据而被阻塞,直到生产线程往队列添加数据,此时成功取到数据而不再阻塞
2. 常用的阻塞队列
- ArrayBlockingQueue:由数组结构组成的有界阻塞队列,底层的出入队由同一个ReentrantLock加锁控制,可以传递fair参数指定使用公平锁 or 非公平锁
- LinkedBlockingQueue:由链表结构组成的有界阻塞队列(容量默认是Integer.MAX_VALUE,因此也可以理解成无界)。其出入队由不同的ReentrantLock控制,因此性能优于ArrayBlockingQueue
- SynchronousQueue:只存储一个元素的阻塞队列,容量大小只有1
3. 操作方法
方法类型 | 抛出异常 | 特殊值 | 阻塞 | 超时 |
---|---|---|---|---|
添加 | add(e) | offer(e) | put() | offer(e,time,unit) |
移除 | remove() | poll() | take() | poll(time,unit) |
获取 | <