文章目录
AQS之BlockingQueue队列
1.什么是BlockingQueue队列
BlockingQueue,是java.util.concurrent 包提供的用于解决并发生产者 - 消费者问题的最有用的类,它的特性是在任意时刻只有一个线程可以进行take或者put操作,并且BlockingQueue提供了超时return null的机制,在许多生产场景里都可以看到这个工具的身影。
2.BlockingQueue API 详解
2.1 入队API
1.add():将元素添加到队列中,如果成功返回true,如果失败抛出new IllegalStateException(“Queue full”);异常。
2.offer():将元素添加到队列中,如果成功返回true,如果失败返回false。
3.put():将元素添加到队列中,如果队列满了,会阻塞。直到有空间插入
4.offer(E e, long timeout, TimeUnit unit):将元素添加到队列中,如果队列满了,会阻塞。直到有空间插入,但是不能超时。超时返回false
2.2 出队API
1.take():获取队列的头部元素并将其删除,如果队列为空,会阻塞,只要队列中有值。
2.poll(long timeout, TimeUnit unit):获取头部元素并将其删除,如果队列中没有值,按照时间来尝试获取值,即如果是1秒,每1秒获取一次,如果获取不到返回null。
3.remove():移出头部的值,不获取。
4.remove(Object o):移出指定的值。
2.3 其他的API
1.remainingCapacity():返回队列当前的剩余容量
2.contains(Object o):判断队列中是否存在此值,存在返回true,不存在返回false。
3.drainTo(Collection<? super E> c); 将队列剩余的值,移出并添加到参数集合中。
4.drainTo(Collection<? super E> c, int maxElements);将队列中固定长度的值,移出并返回到集合中。
3.队列的数据结构
队列实质是一种存储数据的实现。通常用链表或者数组来实现。要满足FIFO先进先出的特性,当然也有双端队列(Deque),优先级队列。
4.队列类型
- 无限队列 (unbounded queue ) - 几乎可以无限增长
- 有限队列 ( bounded queue ) - 定义了最大容量
5. 常用实现类
ArrayBlockingQueue :一个由数组结构组成的有界阻塞队列。
LinkedBlockingQueue :一个由链表结构组成的有界阻塞队列。
PriorityBlockingQueue :一个支持优先级排序的无界阻塞队列。
DelayQueue:一个使用优先级队列实现的无界阻塞队列。
SynchronousQueue:一个不存储元素的阻塞队列。
LinkedTransferQueue:一个由链表结构组成的无界阻塞队列。
LinkedBlockingDeque:一个由链表结构组成的双向阻塞队列。