BlockingQueue系列原始碼解析

2021-08-27 09:03:35 字數 1211 閱讀 9965

說明:blockingqueue是阻塞的有界佇列,典型的生產者消費者模式,相對的是無界佇列linkedtransferqueue。

一.子類

二.公共api

offer(e e): 將給定的元素設定到佇列中,如果設定成功返回true, 否則返回false. e的值不能為空,否則丟擲空指標異常。

offer(e e, long timeout, timeunit unit): 將給定元素在給定的時間內設定到佇列中,如果設定成功返回true, 否則返回false.

add(e e): 將給定元素設定到佇列中,如果設定成功返回true, 否則丟擲異常。如果是往限定了長度的佇列中設定值,推薦使用offer()方法。

put(e e): 將元素設定到佇列中,如果佇列中沒有多餘的空間,該方法會一直阻塞,直到佇列中有多餘的空間。

take(): 從佇列中獲取值,如果佇列中沒有值,執行緒會一直阻塞,直到佇列中有值,並且該方法取得了該值。

poll(long timeout, timeunit unit): 在給定的時間裡,從佇列中獲取值,如果沒有取到會丟擲異常。

remainingcapacity():獲取佇列中剩餘的空間。

remove(object o): 從佇列中移除指定的值。

contains(object o): 判斷佇列中是否擁有該值。

drainto(collection c): 將佇列中值,全部移除,併發設定到給定的集合中。

三.copy個小栗子

有兩個執行緒a,b,  a執行緒每200ms就生成乙個[0,100]之間的隨機數, b執行緒每2s中列印出a執行緒所產生的增量隨機數。

public class blockingqueuetest  catch (exception e) 

}, 0, 200, timeunit.milliseconds); //每200毫秒執行執行緒

product.scheduleatfixedrate(() -> , 2000, 2000, timeunit.milliseconds);

}}

阻塞佇列BlockingQueue

例介紹乙個特殊的佇列 blockingqueue,如果blockingqueue是空的,從blockingqueue取東西的操作將會被阻斷進入等待狀態,直到blockingqueue進了東西才會被喚醒,同樣,如果blockingqueue是滿的,任何試圖往裡存東西的操作也會被阻斷進入等待狀態,直到b...

其他幾種BlockingQueue

priorityblockingqueue是一種基於優先順序的阻塞佇列,優先順序的判斷通過建構函式傳入compator物件來決定,也就是說傳入佇列的物件必須實現comparable介面 在實現priorityblockingqueue時,內部控制線程同步的鎖採用的是公平鎖。然後這個容器在新增物件的時...

BlockingQueue 介面詳解

array blocking queue 是基於陣列的阻塞佇列實現,在 arrayblockingqueue 內部,維護乙個定長陣列,以便快取佇列中的資料物件,內部沒有實現讀寫分離,也就意味著生產者和消費者不能完全並行,長度是需要定義的,可以指定先進先出,或者先進後出,也叫有界佇列 linked b...