1. 程式人生 > >Java多執行緒之間執行緒間的通訊方式

Java多執行緒之間執行緒間的通訊方式

①同步

這裡講的同步是指多個執行緒通過synchronized關鍵字這種方式來實現執行緒間的通訊。

比如:執行緒B需要等待執行緒A執行完了methodA()方法之後,它才能執行methodB()方法。這樣,執行緒A和執行緒B就實現了 通訊。

這種方式,本質上就是“共享記憶體”式的通訊。多個執行緒需要訪問同一個共享變數,誰拿到了鎖(獲得了訪問許可權),誰就可以執行。

②while輪詢的方式

在這種方式下,執行緒A不斷地改變條件,執行緒ThreadB不停地通過while語句檢測這個條件(list.size()==5)是否成立 ,從而實現了執行緒間的通訊。但是這種方式會浪費CPU資源。之所以說它浪費資源,是因為JVM排程器將CPU交給執行緒B執行時,它沒做啥“有用”的工作,只是在不斷地測試 某個條件是否成立。就類似於現實生活中,某個人一直看著手機螢幕是否有電話來了,而不是: 在幹別的事情,當有電話來時,響鈴通知TA電話來了。

關於執行緒的輪詢的影響,可參考:JAVA多執行緒之當一個執行緒在執行死迴圈時會影響另外一個執行緒嗎?

這種方式還存在另外一個問題:

輪詢的條件的可見性問題,關於記憶體可見性問題,可參考:JAVA多執行緒之volatile 與 synchronized 的比較中的第一點“一,volatile關鍵字的可見性

執行緒都是先把變數讀取到本地執行緒棧空間,然後再去再去修改的本地變數。因此,如果執行緒B每次都在取本地的 條件變數,那麼儘管另外一個執行緒已經改變了輪詢的條件,它也察覺不到,這樣也會造成死迴圈。

④管道通訊就是使用java.io.PipedInputStream 和 java.io.PipedOutputStream進行通訊

具體就不介紹了。分散式系統中說的兩種通訊機制:共享記憶體機制和訊息通訊機制。感覺前面的①中的synchronized關鍵字和②中的while輪詢 “屬於” 共享記憶體機制,由於是輪詢的條件使用了volatile關鍵字修飾時,這就表示它們通過判斷這個“共享的條件變數“是否改變了,來實現程序間的交流。

而管道通訊,更像訊息傳遞機制,也就是說:通過管道,將一個執行緒中的訊息傳送給另一個。