執行緒間通訊

2021-10-08 09:29:26 字數 2070 閱讀 3691

多個執行緒在處理同乙個資源,並且任務不同時,需要執行緒通訊來幫助解決執行緒之間對同乙個變數的使用或操作。就是多個執行緒在操作同乙份資料時, 避免對同一共享變數的爭奪。

1)這三個方法是本地方法,同時是final方法,無法被重寫

2)wait()使得當前當前執行緒進入阻塞

notify() 喚醒乙個正在等待當前物件mointor鎖的執行緒,如果有多個執行緒都在這個物件的monitor,隨機選擇乙個喚醒

notifyall() 喚醒所有正在等待當前物件mointor鎖的執行緒

3)wait/notify/notifyall使用在synchronized方法或同步**塊中

鎖池:獲取某一物件的monitor lock,如果當前物件的monitor lock被其他執行緒所獲取了,當前沒有獲取到該物件monitor lock的執行緒就會進入當前物件的鎖池當中

等待池:某一線程呼叫了某一物件的wait方法之後,當前執行緒就會釋放該物件的鎖,進入到該物件的等待池當中

為什麼這三個方法不是thread類中的方法,而是object類中的方法?

有多個執行緒等待當前物件的鎖,這多個執行緒有可能不止是等待當前這乙個物件的鎖,很多執行緒等待很多的鎖,那通過執行緒物件去操作就比較複雜

boolean await() 使得當前執行緒加入到await等待佇列中,釋放當前lock鎖,直到其他執行緒呼叫

signal/signalall會重新請求鎖

void signal();喚醒乙個在await等待佇列上等待的執行緒

void signalall();喚醒所有在await等待佇列上等待的執行緒

1)使用await/signal/signalall必須要去用lock.lock()加鎖

2) 呼叫某個codition的await方法會使得當前執行緒阻塞,await之後的**就不會去執行

3)await呼叫之後會釋放當前的lock

4)signal方法表示喚醒滿足當前條件的乙個執行緒,但是該方法執行之後並不會立即釋放鎖,出了同步**塊才會釋放鎖

5)await方法也是可中斷方法

class

blockingqueue

public

blockingqueue

(int max)

public

void

put(e value)

catch

(interruptedexception e)

}//不滿 則新增資料到佇列中

system.out.

println

(thread.

currentthread()

.getname()

+" has been producting a new value: "

+value)

; queue.

addlast

(value)

;//喚醒阻塞的消費者執行緒 notify

queue.

notifyall()

;}}public e take()

catch

(interruptedexception e)

}//不空 則消費資料

e result = queue.

removefirst()

;//喚醒阻塞的生產者執行緒 notify

queue.

notifyall()

; system.out.

println

(thread.

currentthread()

.getname()

+" has been concuming a new value: "

+result)

;return result;}}

}public

class

producerandconsumer}}

.start()

;new

thread

("consumer"

)catch

(interruptedexception e)}}

}.start()

;}}

執行緒間通訊

執行緒間通訊 多個執行緒在操作統一資源,但各個執行緒操作的動作不同。資源 class res class input implements runnable public void run else x x 1 2 class output implements runnable public vo...

執行緒間通訊

執行緒間的通訊 在乙個多執行緒的應用程式中,所有執行緒共享程序資源,協同工作。所以,執行緒之間的通訊是編寫多執行緒 應用的必不可少的環節。執行緒之間的通訊包括互斥 同步等,它是多 執行緒設計中最難控制的部分,也是關鍵部分。執行緒間的互斥 1 臨界區 在乙個多執行緒 的應用程式中,可能存在這樣的危險 ...

執行緒間通訊

執行緒間通訊 其實就是多個執行緒在操作同乙個資源 但是操作的動作不同。等待喚醒機制 wait notify 0 notifyall 都使用在同步中,因為要對持有監視器 鎖 的執行緒操作。所以要使用在同步中,因為只有同步才具有鎖 為什麼這些操作執行緒的方法要定義object類中呢?因為這些方法在操作同...