十年网站开发经验 + 多家企业客户 + 靠谱的建站团队
量身定制 + 运营维护+专业推广+无忧售后,网站问题一站解决
这期内容当中小编将会给大家带来有关ArrayBlockingQueue知识点有哪些,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。

治多ssl适用于网站、小程序/APP、API接口等需要进行数据传输应用场景,ssl证书未来市场广阔!成为创新互联建站的ssl证书销售渠道,可以享受市场价格4-6折优惠!如果有意向欢迎电话联系或者加微信:18982081108(备注:SSL证书合作)期待与您的合作!
JDK1.8版本,整理有关ArrayBlockingQueue的知识点,并对其中主要的方法进行分析
三者都是插入方法,add()时如果队列满了,会抛出异常;offer()如果队列满了,返回false;put方法,如果队列满了,阻塞等待
add()方法:
public boolean add(E e) {
return super.add(e);//调用父类的add(),父类中又调用了offer()方法,所以最终还是调用offer()方法
}
offer()方法
public boolean offer(E e) {
checkNotNull(e); //判断元素是否为空
final ReentrantLock lock = this.lock;
lock.lock();//获取锁
try {
if (count == items.length) //判断队列是否已满,如果满了 直接返回 false
return false;
else {
enqueue(e); //放入队列中
return true;
}
} finally {
lock.unlock(); //释放锁
}
}
put()方法
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(); // 释放锁
}
} 三者都是元素出队方法
1.peek()取出元素,但不会删除元素
2.poll()取出元素,并删除元素
3.take()取出元素,并且删除,如果队列为空的话,阻塞当前操作
1.peek()方法
public E peek() {
final ReentrantLock lock = this.lock;
lock.lock(); //获取锁
try {
return itemAt(takeIndex); // 获取元素
} finally {
lock.unlock(); //释放锁
}
}
2.poll()
public E poll() {
final ReentrantLock lock = this.lock;
lock.lock();//获取锁
try {
return (count == 0) ? null : dequeue(); //获取元素,并且删除元素
} finally {
lock.unlock();//释放锁
}
}
3.take()
public E take() throws InterruptedException {
final ReentrantLock lock = this.lock;
lock.lockInterruptibly();//获取锁
try {
while (count == 0) //队列为空阻塞
notEmpty.await();
return dequeue(); //获取元素,并删除
} finally {
lock.unlock(); //释放锁
}
}remove()移除元素,使用循环的方式移除
1.remove()方法
public boolean remove(Object o) {
if (o == null) return false; //这个地方为什么不能直接抛异常
final Object[] items = this.items;
final ReentrantLock lock = this.lock;
lock.lock();//获取锁
try {
if (count > 0) {
final int putIndex = this.putIndex;
int i = takeIndex;
do { //循环,直到找到要删除的元素
if (o.equals(items[i])) {
removeAt(i);
return true;
}
if (++i == items.length)
i = 0;
} while (i != putIndex);
}
return false;
} finally {
lock.unlock(); //释放锁
}
}上述就是小编为大家分享的ArrayBlockingQueue知识点有哪些了,如果刚好有类似的疑惑,不妨参照上述分析进行理解。如果想知道更多相关知识,欢迎关注创新互联行业资讯频道。