Condition 執行緒通訊更高效的方式

2022-01-12 05:33:19 字數 1074 閱讀 8289

在condition中,用await()替換wait(),用signal()替換notify(),用signalall()替換notifyall(),傳統執行緒的通訊方式,condition都可以實現,這裡注意,condition是被繫結到lock上的,要建立乙個lock的condition必須用newcondition()方法。

這樣看來,condition和傳統的執行緒通訊沒什麼區別,condition的強大之處在於它可以為多個執行緒間建立不同的condition,下面引入api中的一段**,加以說明。

class

boundedbuffer finally

} public object take() throws

interruptedexception

finally

} }

這是乙個處於多執行緒工作環境下的快取區,快取區提供了兩個方法,put和take,put是存資料,take是取資料,內部有個快取佇列,具體變數和方法說明見**,這個快取區類實現的功能:有多個執行緒往裡面存資料和從裡面取資料,其快取佇列(先進先出後進後出)能快取的最大數值是100,多個執行緒間是互斥的,當快取佇列中儲存的值達到100時,將寫執行緒阻塞,並喚醒讀執行緒,當快取佇列中儲存的值為0時,將讀執行緒阻塞,並喚醒寫執行緒,下面分析一下**的執行過程:

1. 乙個寫執行緒執行,呼叫put方法;

2. 判斷count是否為100,顯然沒有100;

3. 繼續執行,存入值;

4. 判斷當前寫入的索引位置++後,是否和100相等,相等將寫入索引值變為0,並將count+1;

5. 僅喚醒讀執行緒阻塞佇列中的乙個;

6. 乙個讀執行緒執行,呼叫take方法;

7. ……

8. 僅喚醒寫執行緒阻塞佇列中的乙個。

這就是多個condition的強大之處,假設快取佇列中已經存滿,那麼阻塞的肯定是寫執行緒,喚醒的肯定是讀執行緒,相反,阻塞的肯定是讀執行緒,喚醒的肯定是寫執行緒,那麼假設只有乙個condition會有什麼效果呢,快取佇列中已經存滿,這個lock不知道喚醒的是讀執行緒還是寫執行緒了,如果喚醒的是讀執行緒,皆大歡喜,如果喚醒的是寫執行緒,那麼執行緒剛被喚醒,又被阻塞了,這時又去喚醒,這樣就浪費了很多時間。

執行緒同步工具Condition詳解

condition可以代替object監視器方法 wait notify和notifyall 必須和lock配合使用,lock替換synchronized方法和語句的使用,condition取代了物件監視器方法的使用。可以使某個執行緒掛起,直到其他執行緒喚醒,就像object.wait 方法,乙個c...

Java多執行緒應用 condition的使用

它沒有明確指定喚醒那條執行緒。下面是乙個例項 同起三條執行緒,分別執行private aaa a new aaa 物件的三個方法,讓三個方法按指定的順序列印輸入,先是ooo方法迴圈3次,接著nnn方法迴圈5次,接著mmm方法迴圈7次,這樣依次執行迴圈10次 classname conditionte...

Java多執行緒學習 Condition的使用

condition將object監視器方法 wait notify和notifyall 分解成截然不同的物件,以便通過將這些物件與任意lock實現組合使用,為每個物件提供多個等待 set wait set 其中,lock替代了synchronized方法和語句的使用,condition替代了 obj...