java并發(fā) 如何用Java實現(xiàn)跨線程通信?
如何用Java實現(xiàn)跨線程通信?synchronized關(guān)鍵字用于實現(xiàn)線程間的通信。這種方式本質(zhì)上是“共享內(nèi)存”通信。多個線程需要訪問同一個共享變量。誰拿到鎖誰就可以執(zhí)行。如果線程a改變了條件,線程B會
如何用Java實現(xiàn)跨線程通信?
synchronized關(guān)鍵字用于實現(xiàn)線程間的通信。
這種方式本質(zhì)上是“共享內(nèi)存”通信。多個線程需要訪問同一個共享變量。誰拿到鎖誰就可以執(zhí)行。
如果線程a改變了條件,線程B會通過while語句不斷檢查條件是否為真,從而實現(xiàn)線程間的通信。但是這種方法會浪費CPU資源。您可以參考以下示例:
wait()方法可以使線程進入等待狀態(tài),notify()方法可以使等待狀態(tài)喚醒。這種同步機制非常適合生產(chǎn)者和消費者模式:消費者消費資源,生產(chǎn)者生產(chǎn)資源。當資源丟失時,使用者調(diào)用wait()方法自阻塞并等待生產(chǎn)者的產(chǎn)品。生產(chǎn)者完成后,調(diào)用notify/notifyAll()來喚醒消費者進行消費。
使用管道通信java.io.PipedInputStream文件& ampjava.io.PipedOutputStream前兩個是面向字節(jié)的,后兩個是面向字符的。您可以參考以下示例:
Java實現(xiàn)線程同步的幾種方式?
(1)同步方法:按synchronized關(guān)鍵字修改的方法。因為Java中的每個對象都有一個內(nèi)置鎖,所以當用這個關(guān)鍵字修改一個方法時,這個內(nèi)置鎖將保護整個方法。在調(diào)用此方法之前,需要獲取內(nèi)置鎖,否則會被阻止。(2) synchronized代碼塊是用synchronized關(guān)鍵字修飾的語句塊。由該關(guān)鍵字修改的語句塊將自動鎖定以實現(xiàn)同步。(3) 線程同步是通過使用特殊的域變量volatile來實現(xiàn)的。volatile關(guān)鍵字提供了訪問域變量的無鎖機制。B.使用volatile修改域相當于告訴虛擬機該域可能被其他線程更新。因此,每次使用域時,都需要重新計算,而不是使用值D。寄存器中的volatile不提供任何原子操作,也不能用于修改final類型的變量。(4) 利用可重入鎖實現(xiàn)線程同步,在JavaSE5.0中增加了一種新的方法java.util.concurrent文件包以支持同步。reentrantlock類是一個可以重新輸入、互斥并實現(xiàn)鎖接口的鎖。它具有與同步方法和fast相同的基本行為和語義,并擴展了它的能力。(5) 利用局部變量實現(xiàn)線程同步