1、BlockingQueue
BlockingQueue为阻塞队列,其与普通队列不同的是,以put和get为例,阻塞队列在put时,若列表满了,则会等待直到队列可以加入元素;而阻塞队列在get时候,若列表为空,则会等待到队列非空。可以用来解决 生产者消费者问题。
2、ArrayBlockingQueue
阻塞队列在add时,若列表满了,则抛出异常;
阻塞队列在offer时根据不同参数决定;
阻塞队列在put时,若列表满了,则会等待直到队列可以加入元素;
阻塞队列在get时候,若列表为空,则会等待到队列非空。
特点:通过一个lock进行实现,存取共用一个锁,并且是先进先出FIFO;
源码中该阻塞队列提供了3个构造函数:
// 通过指定队列的大小
public ArrayBlockingQueue(int capacity) {
this(capacity, false);
}
// 队列大小 以及 是否创建公平锁 true为公平锁 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();
}
// 将队列c元素都加入初始化的队列中
public ArrayBlockingQueue(int capacity, boolean fair,
Collection<? extends E> c) {
this(capacity, fair);
final ReentrantLock lock = this.lock;
lock.lock(); // Lock only for visibility, not mutual exclusion
try {
int i = 0;
try {
for (E e : c) {
checkNotNull(e);
items[i++] = e;
}
} catch (ArrayIndexOutOfBoundsException ex) {
throw new IllegalArgumentException();
}
count = i;
putIndex = (i == capacity) ? 0 : i;
} finally {
lock.unlock();
}
}
从上面可以了解到,ArrayBlockQueue是指定大小的,并且是通过ReentrantLock(实现公平锁和非公平锁)来进行锁定
ArrayBlockQueue的add(e)实际就是调用了offer(e)
// 根据代码就是获取到ReentranLock 通过加锁和解锁 来实现
public boolean offer(E e) {