java中的阻塞佇列

2021-07-31 20:46:11 字數 1281 閱讀 9692

一、阻塞佇列(blockingqueue) 是乙個支援兩個附加操作的佇列。 這兩個附加的操作支援阻塞的插入和移除方法。

1、支援阻塞的插入方法: 意思是當佇列滿時, 佇列會阻塞插入元素的執行緒, 直到佇列不滿。

2、支援阻塞的移除方法: 意思是在隊列為空時, 獲取元素的執行緒會等待佇列變為非空。

阻塞佇列常用於生產者和消費者的場景, 生產者是向佇列裡新增元素的執行緒, 消費者是從佇列裡取元素的執行緒。 阻塞佇列就是生產者用來存放元素、 消費者用來獲取元素的容器。

在阻塞佇列不可用時, 這兩個附加操作提供了4種處理方式

1、丟擲異常: 當佇列滿時, 如果再往佇列裡插入元素, 會丟擲illegalstateexception("queue full") 異常。 當佇列空時, 從佇列裡獲取元素會丟擲nosuchelementexception異常。

2、返回特殊值: 當往佇列插入元素時, 會返回元素是否插入成功, 成功返回true。 如果是移除方法, 則是從佇列裡取出乙個元素, 如果沒有則返回null。

3、一直阻塞: 當阻塞佇列滿時, 如果生產者執行緒往佇列裡put元素, 佇列會一直阻塞生產者執行緒, 直到佇列可用或者響應中斷退出。 當佇列空時, 如果消費者執行緒從佇列裡take元素, 佇列會阻塞住消費者執行緒, 直到佇列不為空。

4、超時退出: 當阻塞佇列滿時, 如果生產者執行緒往佇列裡插入元素, 佇列會阻塞生產者執行緒一段時間, 如果超過了指定的時間, 生產者執行緒就會退出。

(注、如果是無界阻塞佇列, 佇列不可能會出現滿的情況, 所以使用put或offer方法永遠不會被阻塞, 而且使用offer方法時, 該方法永遠返回true)

二、阻塞佇列的實現原理。

使用通知模式實現。 所謂通知模式, 就是當生產者往滿的佇列裡新增元素時會阻塞住生產者, 當消費者消費了乙個佇列中的元素後, 會通知生產者當前佇列可用。 

通過檢視jdk原始碼發現arrayblockingqueue使用了condition來實現, **如下所示:

private final condition notfull;

private final condition notempty;

public arrayblockingqueue(int capacity, boolean fair)

public void put(e e) throws interruptedexception finally

}p ublic e take() throws interruptedexception finally

}p rivate void insert(e x)

java阻塞佇列

1.介紹 乙個支援兩個附加操作的佇列,兩個附加的操作支援阻塞的插入和移除操作。在阻塞佇列不可用時,兩個附加操作提供了4種處理方式 丟擲異常 返回特殊值 一直阻塞和超時退出。jdk7提供了7個阻塞佇列 1.arrayblockingqueue 陣列結構組成的有界阻塞佇列 預設情況下不保證執行緒公平的訪...

Java裡的7中阻塞佇列

1.arrayblockingqueue 陣列結構的有界佇列 2.linkedblockingqueue 鍊錶結構的有界佇列 3.priorityblockingqueue 支援優先順序排序的無界佇列 4.delayqueue 用優先順序佇列實現的無界阻塞佇列 指定多久才能從佇列中獲取元素,在快取系...

java常用阻塞佇列

blockingqueue 獲取元素的時候等待佇列裡有元素,否則阻塞 儲存元素的時候等待佇列裡有空間,否則阻塞 用來簡化生產者消費者在多執行緒環境下的開發 arrayblockingqueue fifo 陣列實現 有界阻塞佇列,一旦指定了佇列的長度,則佇列的大小不能被改變 在生產者消費者例子中,如果...