回覆列表
  • 1 # 程式猿來導事

    Java多執行緒間通訊方式主要有以下幾種方式:

    1、同步

    透過synchronized關鍵字這種方式來實現執行緒間的通訊。

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

    2、while輪詢的方式

    執行緒Thread A如果改變了條件,執行緒Thread B不停地透過while語句檢測這個條件是否成立 ,從而實現了執行緒間的通訊。但是這種方式會浪費CPU資源。可以參照如下例子:

    3、wait/notify機制

    wait()方法可以使執行緒進入等待狀態,而notify()可以使等待的狀態喚醒。這樣的同步機制十分適合生產者、消費者模式:消費者消費某個資源,而生產者生產該資源。

    當該資源缺失時,消費者呼叫wait()方法進行自我阻塞,等待生產者的生產;生產者生產完畢後呼叫notify/notifyAll()喚醒消費者進行消費。

    4、管道通訊

    管道通訊就是使用java.io.PipedInputStream &java.io.PipedOutputStream 和 PipedReader&PipedWriter,前兩種面向位元組,而後兩種面向字元。可以參照如下例子:

    希望以上描述能夠幫助到你,可以一起交流和學習!

  • 2 # 一席話君

    我將從syncrhoized notifyAll ReentrantLock這三個關鍵詞的角度談談

    一.syncrhoized加鎖的執行緒的Object類的wait()/notify()/notifyAll()

    1.wait()、notify()和notifyAll()方法是本地方法,並且為final方法,無法被重寫。

    2.呼叫某個物件的wait()方法能讓當前執行緒阻塞,並且當前執行緒必須擁有此物件的monitor(即鎖)

    3.呼叫某個物件的notify()方法能夠喚醒一個正在等待這個物件的monitor的執行緒,如果有多個執行緒都在等待這個物件的monitor,則只能喚醒其中一個執行緒;

    4.呼叫notifyAll()方法能夠喚醒所有正在等待這個物件的monitor的執行緒

    二.ReentrantLock類加鎖的執行緒的Condition類的await()/signal()/signalAll()

    1.Condition是個介面,基本的方法就是await()和signal()方法;

    2.Condition依賴於Lock介面,生成一個Condition的基本程式碼是lock.newCondition()

    3. 呼叫Condition的await()和signal()方法,都必須在lock保護之內,就是說必須在lock.lock()和lock.unlock之間才可以使用

    三.透過管道進行執行緒間通訊:1)位元組流;2)字元流

    Java中有各種各樣的輸入、輸出流(Stream),其中管道流(pipeStream)是一種特殊的流,用於在不同執行緒間直接傳送資料。

    一個執行緒傳送資料到輸出管道,另一個執行緒從輸入管道讀資料。

    本人專注網際網路最新技術,大資料,資料採集,資料處理,資料治理,望交流!!

  • 中秋節和大豐收的關聯?
  • 如何理解科恩兄弟執導的電影《老無所依》?