java 條件佇列

2021-08-30 12:02:08 字數 1180 閱讀 3908

條件佇列讓一組執行緒-稱作等待集-以某種方式等待相關條件變成真,它也由此得名。不同於傳統的佇列,它們的元素是資料項;條件佇列的元素是等待相關條件的執行緒。

@threadsafe

public classboundedbufferextendsbaseboundedbuffer

public synchronized void put(v v)throws interruptedexception{

while (isfull())

wait();

doput(v);

notifyall();

public synchronized v take() throws interruptedexception{

while (isempty())

wait();

v v=dotake();

notifyall();

return v;

當從wait中喚醒後,必須再次測試條件謂詞。規範寫法如下:

pulbic statedependentmethod() throws interruptedexception{

//條件謂詞必須被鎖守護

synchronized(lock){

while (!conditionpredicate())

lock.wait();

//現在,物件處於期望的狀態中

當使用條件等待時,

1)永遠設定乙個條件謂詞-一些物件狀態的測試,執行緒執行前必須滿足它

2)永遠在呼叫wait前測試條件謂詞,並從wait中返回後再次測試

3)永遠在迴圈中呼叫wait

4)確保構成條件謂詞的狀態變數被鎖保護,而這個鎖正是與條件佇列相關聯的

5)當呼叫wait、notify或notifyall時,要持有與條件佇列相關聯的鎖,並且在檢查條件謂詞之後,開始執行被保護的邏輯之前,不要釋放鎖

無論何時,當你在等待乙個條件,一定要確保有人會在條件謂詞變為真時通知你,一般使用nofifyall。

只有同時滿足下述條件後,才能用單一的notify取代notifyall:

相同的等待者。只有乙個條件謂詞與條件佇列相關,每個執行緒從wait返回後執行相同的邏輯;並且,一進一出,乙個對條件變數的通知,至多啟用乙個執行緒執行。

向上述**中的生產者-訊息者,2個條件謂詞(非空和非滿)與條件佇列相關,必須使用notifyall

JAVA佇列之優先佇列

最近在專案開發中開發了全雙工非同步長連線的通訊元件,內部用到了延遲佇列。而延遲佇列的內部實現的儲存是用到了優先佇列,當時看c 的資料結構時,了解過優先佇列,用的儲存是二叉樹的邏輯,應該叫完全二叉樹,也可以叫做最大堆。下面看一下二叉樹的演算法,主要看插入和刪除。二叉樹顧名思義就像一棵樹,每個節點下最多...

迴圈佇列隊滿條件

隊頭指標在隊尾指標的下一位置時,隊滿。q.front q.rear 1 maxsize 因為隊頭指標可能又重新從0位置開始,而此時隊尾指標是maxsize 1,所以需要求餘。當隊頭和隊尾指標在同一位置時,隊空。q.front q.rear 1 include 2 include 3 define m...

java條件語句之for

public static void main string args elseelse if regist n else system.out.println 請登入 for int i 1 i 3 i else if i 3 2 輸入五個數,通過運算,求出這五個數最大值和最小值。int max ...