ArrayBlockingQueue阻塞队列,队尾插入,队首取出.有几个重要的方法.
add(E e):添加成功返回true,否则抛出异常 实际调用了offer(E e) offer(E e):添加成功返回true,否则false. put(E e):阻塞方法,如果满了会一直等待,等待被中断.poll():队列为空则返回null,否则取出元素. take():队列为空一直等待,否则取出 poll(long timeout, TimeUnit unit):队列不为空,取出元素.否则等待固定时间在取一次.
通过源码发现.所有的方法都使用了可重入锁ReentrantLock 的经典用法.
比如获取size()
public int size() { final ReentrantLock lock = new ReentrantLock(true); lock.lock(); try { return count; } finally { lock.unlock(); } }可重入锁ReentrantLock模板:
final ReentrantLock lock = new ReentrantLock(true); lock.lock(); try { //XXXXXXXXX } finally { lock.unlock(); } 一部分使用了可中断的方法: final ReentrantLock lock = new ReentrantLock(true); lock.lockInterruptibly(); try { //XXXX } finally { lock.unlock(); }基于数组的阻塞队列在并发编程中经常使用.学会熟练使用重要方法和Lock很重要.