阻塞佇列,顧名思義:如果佇列滿了,那麼會進入阻塞狀態,當有消費者從佇列中取出資料後,再解除阻塞狀態。如果隊列為空,從佇列中取資料就會進入阻塞狀態。直至佇列中有資料為止。
blockingqueue是介面,目前已知的實現類如下:
arrayblockingqueue:底層底層通過陣列來儲存佇列中的元素,所以建立時需要指定容量。
linkedblockingqueue:底層通過鍊錶來實現,「無界」的阻塞佇列。最多能夠存放integer.max_value個元素。
priorityblockingqueue:是乙個無界的併發佇列,實現自動排序的功能。無法插入null值,所有插入的資料需要實現comparable介面。
synchronousqueue:安全的佇列,這個佇列裡只能存乙個資料。與執行緒池連用組成「大池子小佇列」模式。
存入元素時:
/**arrayblockingqueue:底層通過陣列來儲存佇列中的元素,
* 所以建立物件時需要指定容量(陣列開闢位址空間時使用)
* size():獲取的是佇列中已經新增的元素的個數,而不是指定的容量。
* 1在佇列未滿時執行以下方法:
* boolean add(..):可以正常執行,並返回true
* boolean offer(..):可以正常新增,並返回true
* void put(..):可以正常新增,並沒有產生阻塞。
* offer(o, timeout, timeunit) :
* o:被新增的元素
* timeout:時間的值
* timeunit:時間的單位
* 直接執行新增,並不會產生阻塞。
* 2在佇列已滿時執行以下方法:
* add(..):丟擲illegalstateexception: queue full
* boolean offer(..):新增失敗,返回false
* void put(..):會產生阻塞,阻塞直到阻塞物件變為未滿時才釋放。
* offer(o, timeout, timeunit) :會產生阻塞,在指定的
* 時間內如果阻塞佇列中有空間則阻塞釋放,向佇列中新增元素;
* 如果指定的時間到了,而阻塞佇列一直是滿的狀態,返回false.
*/public
void
testput()
try catch (interruptedexception e)
}
取出元素時:
/**1在阻塞佇列中還存在元素:
* e remove():獲取先存入的元素並返回該元素,並將該元素從阻
* 塞佇列中刪除。
* boolean remove(..):刪除指定的元素,刪除成功返回true,
* 反之返回false
* poll():獲取最先存入的元素,並返回。
* e poll(long timeout, timeunit unit):獲取最先存入的元素,
* 並返回。
* e take():獲取最先存入的元素。
* 以上方法,獲取阻塞佇列中的元素後,阻塞佇列中將不再有該元素。
* 2在阻塞佇列不存在元素:
* t remove():丟擲nosuchelementexception
* boolean remove(..):刪除指定的元素,刪除成功返回true,
* 反之返回false
* poll():返回null
* poll(long timeout, timeunit unit):產生阻塞,等待指定的
* 時間;如果在該時間記憶體入了元素,那麼直接獲取先存入的元素。
* 如果在該時間內容沒有存入元素,待時間結束後阻塞釋放,不再獲取。
* take():產生阻塞,直到有元素存入;並將獲取到的元素返回。
*/public
void
testtake() catch (interruptedexception e)
system.out.println();
}
使用的方法和arrayblockingqueue相同。
使用的方法和arrayblockingqueue相同。存入的元素會被排序,排序的規則和實現的comparable內容有關。
java 併發工具包 BlockingQueue
blockingqueue 是乙個介面,字義上理解表示為乙個阻塞佇列 1 生產者入隊 2 消費者出隊 blockingqueue 具有 4 組不同的方法用於插入 移除以及對佇列中的元素進行檢查。如果請求的操作不能得到立即執行的話,每個方法的表現也不同。這些方法如下 拋異常 特定值 阻塞 超時 四組不...
jdk併發工具包之鎖
1 cynchronized擴充套件 可重如鎖reentrantlock reentrantlock是通過cas演算法實現的 renntrantlock lock new reentrantlock lock.lock 如果資源被占用則會等待 鎖定區域 finally 必須手動解鎖 lock.unl...
拷貝工具包
常用工具包封裝.懶得引各種雜七八的包,輕量級包.cglib還是需要的 scope provided 1.0.0 copyutils beancopier封裝.提供簡單的單一複製與list複製.不支援自定義建構函式的類的複製.abc abc copyutil copysigle abc class o...