您好,登录后才能下订单哦!
密码登录
登录注册
点击 登录注册 即表示同意《亿速云用户服务条款》
这期内容当中小编将会给大家带来有关ArrayBlockingQueue知识点有哪些,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。
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知识点有哪些了,如果刚好有类似的疑惑,不妨参照上述分析进行理解。如果想知道更多相关知识,欢迎关注亿速云行业资讯频道。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。