java ArrayBlockingQueue的方法及缺點分析
提到ArrayBlockingQueue的方法,想必大傢都不陌生,我們在入隊和出隊的時候,接觸瞭不少這方面的函數。當然ArrayBlockingQueue中的方法也不止於此,今天我們就全部為大傢羅列出來,也算是做一個學習方向上的指引。然後就其中的peek方法帶來實例介紹,並說明ArrayBlockingQueue使用的不足之處。
1.ArrayBlockingQueue函數列表
// 創建一個帶有給定的(固定)容量和默認訪問策略的 ArrayBlockingQueue。 ArrayBlockingQueue(int capacity) // 創建一個具有給定的(固定)容量和指定訪問策略的 ArrayBlockingQueue。 ArrayBlockingQueue(int capacity, boolean fair) // 創建一個具有給定的(固定)容量和指定訪問策略的 ArrayBlockingQueue,它最初包含給定 collection 的元素,並以 collection 迭代器的遍歷順序添加元素。 ArrayBlockingQueue(int capacity, boolean fair, Collection<? extends E> c) // 將指定的元素插入到此隊列的尾部(如果立即可行且不會超過該隊列的容量),在成功時返回 true,如果此隊列已滿,則拋出 IllegalStateException。 boolean add(E e) // 自動移除此隊列中的所有元素。 void clear() // 如果此隊列包含指定的元素,則返回 true。 boolean contains(Object o) // 移除此隊列中所有可用的元素,並將它們添加到給定 collection 中。 int drainTo(Collection<? super E> c) // 最多從此隊列中移除給定數量的可用元素,並將這些元素添加到給定 collection 中。 int drainTo(Collection<? super E> c, int maxElements) // 返回在此隊列中的元素上按適當順序進行迭代的迭代器。 Iterator<E> iterator() // 將指定的元素插入到此隊列的尾部(如果立即可行且不會超過該隊列的容量),在成功時返回 true,如果此隊列已滿,則返回 false。 boolean offer(E e) // 將指定的元素插入此隊列的尾部,如果該隊列已滿,則在到達指定的等待時間之前等待可用的空間。 boolean offer(E e, long timeout, TimeUnit unit) // 獲取但不移除此隊列的頭;如果此隊列為空,則返回 null。 E peek() // 獲取並移除此隊列的頭,如果此隊列為空,則返回 null。 E poll() // 獲取並移除此隊列的頭部,在指定的等待時間前等待可用的元素(如果有必要)。 E poll(long timeout, TimeUnit unit) // 將指定的元素插入此隊列的尾部,如果該隊列已滿,則等待可用的空間。 void put(E e) // 返回在無阻塞的理想情況下(不存在內存或資源約束)此隊列能接受的其他元素數量。 int remainingCapacity() // 從此隊列中移除指定元素的單個實例(如果存在)。 boolean remove(Object o) // 返回此隊列中元素的數量。 int size() // 獲取並移除此隊列的頭部,在元素變得可用之前一直等待(如果有必要)。 E take() // 返回一個按適當順序包含此隊列中所有元素的數組。 Object[] toArray() // 返回一個按適當順序包含此隊列中所有元素的數組;返回數組的運行時類型是指定數組的運行時類型。 <T> T[] toArray(T[] a) // 返回此 collection 的字符串表示形式。 String toString()
2.peek方法實例
讀取隊列中隊首的元素,不會刪除該元素。
//獲取元素,元素不出隊 public E peek() { //上鎖 final ReentrantLock lock = this.lock; lock.lock(); try { //調用itemAt方法獲取元素 return itemAt(takeIndex); // null when queue is empty } finally { //釋放鎖資源 lock.unlock(); } }
3.ArrayBlockingQueue缺點
(1)隊列長度固定且必須在初始化時指定,所以使用之前一定要慎重考慮好容量;
(2)如果消費速度跟不上入隊速度,則會導致提供者線程一直阻塞,且越阻塞越多,非常危險;
(3)隻使用瞭一個鎖來控制入隊出隊,效率較低
ArrayBlockingQueue用法擴展:
1、ArrayBlockingQueue(int)
接收一個整型的參數,這個整型參數指的是隊列的長度,其定義如下,
public ArrayBlockingQueue(int capacity) { this(capacity, false); }
可以看到這個方法調用的是ArrayBlockingQueue(int,boolean)方法,那麼看下這個方法,
2、ArrayBlockingQueue(int,boolean)
接收兩個參數,一個整型,一個boolean類型,前邊已經知道整型參數是隊列的長度,那麼boolean類型參數代表什麼意思那,其定義如下,
public ArrayBlockingQueue(int capacity, boolean fair) { if (capacity <= 0) throw new IllegalArgumentException(); this.items = new Object[capacity]; lock = new ReentrantLock(fair); notEmpty = lock.newCondition(); notFull = lock.newCondition(); }
可以看到在這個構造方法中進行瞭相關邏輯實現,對items進行瞭數組初始化,boolean類型的參數是作為可重入鎖的參數進行初始化,規定可重入鎖是公平還是不公平,默認為false,另外初始化瞭notEmpty、notFull兩個信號量。
到此這篇關於java ArrayBlockingQueue的方法及缺點分析的文章就介紹到這瞭,更多相關java ArrayBlockingQueue的方法及不足點內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!
推薦閱讀:
- Java常見的阻塞隊列總結
- Java中常用阻塞隊列的問題小結
- Java高並發BlockingQueue重要的實現類詳解
- Java線程池隊列LinkedBlockingDeque
- LinkedBlockingQueue鏈式阻塞隊列的使用和原理解析