#ArrayBlockQueuejava
//存储数组 final Object[] items; //取索引 int takeIndex; //插索引 int putIndex; //元素容量 int count; //同步锁 final ReentrantLock lock; //取阻塞条件 private final Condition notEmpty; //插入阻塞条件 private final Condition notFull;
//lock 优先考虑获取锁,待获取锁成功后,才响应中断。 //lockInterruptibly 优先考虑响应中断,而不是响应锁的普通获取或重入获取 public void put(E e) throws InterruptedException { checkNotNull(e); final ReentrantLock lock = this.lock; //容许其余线程来来中断当前线程,抛出异常 lock.lockInterruptibly(); try { while (count == items.length) notFull.await(); enqueue(e); } finally { lock.unlock(); } }
public E take() throws InterruptedException { final ReentrantLock lock = this.lock; lock.lockInterruptibly(); try { while (count == 0) notEmpty.await(); return dequeue(); } finally { lock.unlock(); } }