您好,登錄后才能下訂單哦!
這期內容當中小編將會給大家帶來有關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進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。