多線程知識3-線程間通信

常用的線程間通信實現:

(1)等待/通知機制:wait/Notify實現進程間通信

(2):生產者消費者實現

(3):管道

(4).join()方法,

(5ThreadLocal類的使用。

 

(1):等待通知機制的實現:wait方法是使當前執行代碼的線程進行等待。

是object的方法,該方法將線程放入預處理隊列中,並且在該處停止執行。

會釋放鎖。在調用wait之前,必須要有對象鎖,也就是說必須在同步方法或者同步塊中使用。如果沒有適當的鎖,會拋出:IllegalMonitorStateException異常。而notify也要在同步塊中調用,用來通知那些等待該對象鎖的其他線程,如果有多個線程,由jvm選擇一個即可,用notifyAll則是通知所有等待的線程:注意的是:通知之後不會立即釋放鎖,而是退出Synchronized塊的時候,纔會釋放。

每個鎖對象都有兩個隊列,就緒隊列和阻塞隊列。

Wait被執行後鎖自動釋放,notify執行後,鎖不釋放

當線程處於wait狀態時,執行interrupt會出現InterruptException異常。

執行完同步代碼塊就會自動釋放鎖

在同步代碼塊執行過程中要是出現異常,會釋放鎖

 

(2):生產者消費者模式:一對一模式,多對多模式可能出現假死的現象,出現假死的原因是連續喚醒的是同類。解決方法是用notifyAll.

(3)通過管道通信:一。字節流,管道流是一種特殊的流,用於在不同的線程間進行通信,通信的介質是內存。一個線程發送數據到輸出管道PipedOutputStream,另一個線程從輸入管道讀出數據。在jdk中提供了四個類來使線程可以通信:PipedInputStream,PipedOutputStream,PipedReader,PipedWriter 

使用inputStream.connect(outputstream),或者OutputStream.connect(inputstream)可以使兩個Stream之間產生通信連接,這樣纔可以進行數據的輸入和輸出。

(4)Join:在很多情況下,主線程創建了子線程,但是子線程有大量的耗時計算,主線程往往結束的早,着時候要是主線程要等子線程結束再結束就要用join,join的作用是等待線程對象銷燬。

Join也有使線程進行排隊等待的作用,類似於同步的效果

但是Join與Synchronized的區別是:join在內部使用的是wait方法進行等待,而Synchronized使用的是對象監視器的原理作爲同步。

Join(long)方法具有釋放鎖的特點,因爲在內部是wait(long)實現的.Thread.sleep(long)卻不釋放鎖。

(5):每一個線程都有自己共享的實例變量,ThreadLocal類就是解決這樣的問題。將ThreadLocal類比作一個盒子,每個盒子中可以存儲每個線程的私有數據。ThreadLocal解決的是不同線程之間的隔離性,也就是說每個線程擁有自己的值,不同線程中的值是可以放到該類中進行保存。

發佈了43 篇原創文章 · 獲贊 15 · 訪問量 10萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章