java ArrayBlockingQueue的方法及缺點(diǎn)分析
提到ArrayBlockingQueue的方法,想必大家都不陌生,我們?cè)谌腙?duì)和出隊(duì)的時(shí)候,接觸了不少這方面的函數(shù)。當(dāng)然ArrayBlockingQueue中的方法也不止于此,今天我們就全部為大家羅列出來(lái),也算是做一個(gè)學(xué)習(xí)方向上的指引。然后就其中的peek方法帶來(lái)實(shí)例介紹,并說(shuō)明ArrayBlockingQueue使用的不足之處。
1.ArrayBlockingQueue函數(shù)列表
// 創(chuàng)建一個(gè)帶有給定的(固定)容量和默認(rèn)訪問策略的 ArrayBlockingQueue。 ArrayBlockingQueue(int capacity) // 創(chuàng)建一個(gè)具有給定的(固定)容量和指定訪問策略的 ArrayBlockingQueue。 ArrayBlockingQueue(int capacity, boolean fair) // 創(chuàng)建一個(gè)具有給定的(固定)容量和指定訪問策略的 ArrayBlockingQueue,它最初包含給定 collection 的元素,并以 collection 迭代器的遍歷順序添加元素。 ArrayBlockingQueue(int capacity, boolean fair, Collection<? extends E> c) // 將指定的元素插入到此隊(duì)列的尾部(如果立即可行且不會(huì)超過該隊(duì)列的容量),在成功時(shí)返回 true,如果此隊(duì)列已滿,則拋出 IllegalStateException。 boolean add(E e) // 自動(dòng)移除此隊(duì)列中的所有元素。 void clear() // 如果此隊(duì)列包含指定的元素,則返回 true。 boolean contains(Object o) // 移除此隊(duì)列中所有可用的元素,并將它們添加到給定 collection 中。 int drainTo(Collection<? super E> c) // 最多從此隊(duì)列中移除給定數(shù)量的可用元素,并將這些元素添加到給定 collection 中。 int drainTo(Collection<? super E> c, int maxElements) // 返回在此隊(duì)列中的元素上按適當(dāng)順序進(jìn)行迭代的迭代器。 Iterator<E> iterator() // 將指定的元素插入到此隊(duì)列的尾部(如果立即可行且不會(huì)超過該隊(duì)列的容量),在成功時(shí)返回 true,如果此隊(duì)列已滿,則返回 false。 boolean offer(E e) // 將指定的元素插入此隊(duì)列的尾部,如果該隊(duì)列已滿,則在到達(dá)指定的等待時(shí)間之前等待可用的空間。 boolean offer(E e, long timeout, TimeUnit unit) // 獲取但不移除此隊(duì)列的頭;如果此隊(duì)列為空,則返回 null。 E peek() // 獲取并移除此隊(duì)列的頭,如果此隊(duì)列為空,則返回 null。 E poll() // 獲取并移除此隊(duì)列的頭部,在指定的等待時(shí)間前等待可用的元素(如果有必要)。 E poll(long timeout, TimeUnit unit) // 將指定的元素插入此隊(duì)列的尾部,如果該隊(duì)列已滿,則等待可用的空間。 void put(E e) // 返回在無(wú)阻塞的理想情況下(不存在內(nèi)存或資源約束)此隊(duì)列能接受的其他元素?cái)?shù)量。 int remainingCapacity() // 從此隊(duì)列中移除指定元素的單個(gè)實(shí)例(如果存在)。 boolean remove(Object o) // 返回此隊(duì)列中元素的數(shù)量。 int size() // 獲取并移除此隊(duì)列的頭部,在元素變得可用之前一直等待(如果有必要)。 E take() // 返回一個(gè)按適當(dāng)順序包含此隊(duì)列中所有元素的數(shù)組。 Object[] toArray() // 返回一個(gè)按適當(dāng)順序包含此隊(duì)列中所有元素的數(shù)組;返回?cái)?shù)組的運(yùn)行時(shí)類型是指定數(shù)組的運(yùn)行時(shí)類型。 <T> T[] toArray(T[] a) // 返回此 collection 的字符串表示形式。 String toString()
2.peek方法實(shí)例
讀取隊(duì)列中隊(duì)首的元素,不會(huì)刪除該元素。
//獲取元素,元素不出隊(duì) public E peek() { //上鎖 final ReentrantLock lock = this.lock; lock.lock(); try { //調(diào)用itemAt方法獲取元素 return itemAt(takeIndex); // null when queue is empty } finally { //釋放鎖資源 lock.unlock(); } }
3.ArrayBlockingQueue缺點(diǎn)
(1)隊(duì)列長(zhǎng)度固定且必須在初始化時(shí)指定,所以使用之前一定要慎重考慮好容量;
(2)如果消費(fèi)速度跟不上入隊(duì)速度,則會(huì)導(dǎo)致提供者線程一直阻塞,且越阻塞越多,非常危險(xiǎn);
(3)只使用了一個(gè)鎖來(lái)控制入隊(duì)出隊(duì),效率較低
ArrayBlockingQueue用法擴(kuò)展:
1、ArrayBlockingQueue(int)
接收一個(gè)整型的參數(shù),這個(gè)整型參數(shù)指的是隊(duì)列的長(zhǎng)度,其定義如下,
public ArrayBlockingQueue(int capacity) { this(capacity, false); }
可以看到這個(gè)方法調(diào)用的是ArrayBlockingQueue(int,boolean)方法,那么看下這個(gè)方法,
2、ArrayBlockingQueue(int,boolean)
接收兩個(gè)參數(shù),一個(gè)整型,一個(gè)boolean類型,前邊已經(jīng)知道整型參數(shù)是隊(duì)列的長(zhǎng)度,那么boolean類型參數(shù)代表什么意思那,其定義如下,
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(); }
可以看到在這個(gè)構(gòu)造方法中進(jìn)行了相關(guān)邏輯實(shí)現(xiàn),對(duì)items進(jìn)行了數(shù)組初始化,boolean類型的參數(shù)是作為可重入鎖的參數(shù)進(jìn)行初始化,規(guī)定可重入鎖是公平還是不公平,默認(rèn)為false,另外初始化了notEmpty、notFull兩個(gè)信號(hào)量。
到此這篇關(guān)于java ArrayBlockingQueue的方法及缺點(diǎn)分析的文章就介紹到這了,更多相關(guān)java ArrayBlockingQueue的方法及不足點(diǎn)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- java ArrayBlockingQueue阻塞隊(duì)列的實(shí)現(xiàn)示例
- Java中ArrayBlockingQueue和LinkedBlockingQueue
- Java 并發(fā)編程ArrayBlockingQueue的實(shí)現(xiàn)
- Java源碼解析阻塞隊(duì)列ArrayBlockingQueue介紹
- Java源碼解析阻塞隊(duì)列ArrayBlockingQueue常用方法
- Java源碼解析阻塞隊(duì)列ArrayBlockingQueue功能簡(jiǎn)介
- 詳細(xì)分析Java并發(fā)集合ArrayBlockingQueue的用法
- java并發(fā)之ArrayBlockingQueue詳細(xì)介紹
- Java并發(fā)編程ArrayBlockingQueue的使用
相關(guān)文章
一文探索Apache HttpClient如何設(shè)定超時(shí)時(shí)間
Apache HttpClient是一個(gè)流行的Java庫(kù),用于發(fā)送HTTP請(qǐng)求,這篇文章主要為大家介紹了Apache HttpClient如何設(shè)定超時(shí)時(shí)間,感興趣的小伙伴可以學(xué)習(xí)一下2023-10-10Java設(shè)計(jì)模式之初識(shí)行為型模式
今天帶大家學(xué)習(xí)Java設(shè)計(jì)模式的相關(guān)知識(shí)點(diǎn),文中對(duì)Java行為型模式做了非常詳細(xì)的介紹及代碼示例,對(duì)正在學(xué)習(xí)java的小伙伴們很有幫助,需要的朋友可以參考下2021-06-06SpringBoot?@Transactional事務(wù)不生效排查方式
這篇文章主要介紹了SpringBoot?@Transactional事務(wù)不生效排查方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-01-01Springboot+AOP實(shí)現(xiàn)返回?cái)?shù)據(jù)提示語(yǔ)國(guó)際化的示例代碼
這篇文章主要介紹了Springboot+AOP實(shí)現(xiàn)返回?cái)?shù)據(jù)提示語(yǔ)國(guó)際化的示例代碼,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-07-07SpringBoot2.0+阿里巴巴Sentinel動(dòng)態(tài)限流實(shí)戰(zhàn)(附源碼)
這篇文章主要介紹了SpringBoot2.0+阿里巴巴Sentinel動(dòng)態(tài)限流實(shí)戰(zhàn)(附源碼),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-11-11如何在Spring Boot項(xiàng)目中使用Spring AI
Spring AI是Spring框架中用于集成和使用人工智能和機(jī)器學(xué)習(xí)功能的組件,它提供了一種簡(jiǎn)化的方式來(lái)與AI模型進(jìn)行交互,這篇文章主要介紹了Spring Boot 在項(xiàng)目中使用Spring AI,需要的朋友可以參考下2024-05-05springboot服務(wù)正常啟動(dòng)之后,訪問服務(wù)url無(wú)響應(yīng)問題及解決
這篇文章主要介紹了springboot服務(wù)正常啟動(dòng)之后,訪問服務(wù)url無(wú)響應(yīng)問題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-07-07Java中的Semaphore信號(hào)量簡(jiǎn)析
這篇文章主要介紹了Java中的Semaphore信號(hào)量簡(jiǎn)析,Semaphore:信號(hào)量,用來(lái)限制能同時(shí)訪問共享資源的線程上限,使用Semaphore實(shí)現(xiàn)簡(jiǎn)單連接池,對(duì)比享元模式下的實(shí)現(xiàn)(用wait和notify),性能和可讀性要更好,需要的朋友可以參考下2023-12-12