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