垫江网站建设价格,网站开发售后服务协议,网站建设对付客户,旅游最新消息1、什么是阻塞队列#xff1f; 顾名思义#xff0c;就是支持阻塞的队列#xff0c;相比于其他的队列#xff0c;阻塞队列支持以下特性#xff1a;
队列为空的时候#xff0c;获取元素的线程会等待队列变为非空。队列为满的时候#xff0c;存储元素的线程会等待队列可以… 1、什么是阻塞队列 顾名思义就是支持阻塞的队列相比于其他的队列阻塞队列支持以下特性
队列为空的时候获取元素的线程会等待队列变为非空。队列为满的时候存储元素的线程会等待队列可以放入元素。 2、阻塞队列的用处 通常用于生产者-消费者模型可以起到解耦削峰填谷的作用 3、java中的阻塞队列 JDK7提供了7个阻塞队列。分别是
ArrayBlockingQueue 一个由数组结构组成的有界阻塞队列。LinkedBlockingQueue 一个由链表结构组成的有界阻塞队列。PriorityBlockingQueue 一个支持优先级排序的无界阻塞队列。DelayQueue 一个使用优先级队列实现的无界阻塞队列。SynchronousQueue 一个不存储元素的阻塞队列。LinkedTransferQueue 一个由链表结构组成的无界阻塞队列。LinkedBlockingDeque 一个由链表结构组成的双向阻塞队列。 4、介绍一些阻塞队列中常用的方法 添加元素的方法 offer(E e)添加元素不涉及阻塞offer(E e, long timeout, TimeUnit unit)带时间参数的offer如果队列满了会阻塞指定时间进行尝试添加超时才会返回falseput(E e) 如果没办法添加到队列中就会一直阻塞下去取出元素的方法取出并移除 poll() 取出元素取不到就返回nullpoll(long timeout, TimeUnit unit) 取出元素取不到就等待指定时间后还取不到才会退出take()如果取不到元素就一直阻塞下去 5、 源码这里只介绍ArrayBlockingQueue其他的也大同小异 5.1、基本属性和构造器
// 底层实现数组
final Object[] items;
// 队列头部的索引坐标因为是FIFO用于take poll peek get等方法
int takeIndex;// 队列尾部的索引坐标用于offerput add等方法
int putIndex;// 记录队列中元素的个数
int count;// 锁默认非公平锁
final ReentrantLock lock;// 定义两个条件对象分别表示队列不为空或者队列不为满
private final Condition notEmpty;
private final Condition notFull;// 构造方法默认使用费公平锁也可以传入参数选择公平锁
public ArrayBlockingQueue(int capacity) {this(capacity, false);
}public ArrayBlockingQueue(int capacity, boolean fair) {if (capacity 0)throw new IllegalArgumentException();this.items new Object[capacity];lock new ReentrantLock(fair);notEmpty lock.newCondition();notFull lock.newCondition();
}
5.2 、添加元素方法
5.2.1 、add 方法其实最终调用的也是offer方法就是添加元素不涉及阻塞 5.2.2、 不带时间参数的offer
看上述代码先加锁如果数组元素满了添加失败返回false否则添加成功返回true。
5.2.3、带时间参数的offer
看代码如如果队列满了就await指定时间指定时间内没有成功添加的话返回false 5.2.4 put 方法
看代码如果队列是满的添加不进去该方法会一直阻塞 5.3 、取出元素方法
5.3.1 不带时间参数的poll
如果为空就返回null不为空就取出队列头部元素 5.3.2 带时间参数的poll
如果为空等待指定时间指定时间后还取不到元素就返回null 5.3.3 take方法
如果取不到元素就一直阻塞下去。 5.4、enqueue 和 dequeue
enqueue将元素添加到数组中的具体方法
将元素插入数组的指定坐标如果当前坐标已经是数组元素的最后一位了那么下一位坐标要从0开始类似一个环形数组当前元素树加1激活因为队列为空而阻塞的线程。 dequeue 将元素从数组中取出的具体方法
获取队头的元素然后指定坐标位置元素置为null如果当前坐标已经是数组元素的最后一位了那么下一位坐标要从0开始类似一个环形数组当前元素数量减一激活因为队列满了而阻塞的线程