多個執行緒在處理同乙個資源,並且任務不同時,需要執行緒通訊來幫助解決執行緒之間對同乙個變數的使用或操作。就是多個執行緒在操作同乙份資料時, 避免對同一共享變數的爭奪。
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類中呢?因為這些方法在操作同...