多線程編程-- part 4 線程間的通信
阿新 • • 發佈:2017-05-25
如果 方法 notify 實例 static monitor 相關 線程 異常
線程間的相互作用
線程之間需要一些協調通信,來共同完成一件任務。
Object類相關的方法:notify(),notifyAll(),wait()。會被所有的類繼承,這些方法是final不能被重寫。他們操控的是每個對象都會有的鎖,如果不在synchronized裏面調用wait,notify,notifyAll方法,運行時會報異常:要調用對象的這些方法,必須先獲得這個對象的鎖。
wait():
使得當前線程必須等待,進入到等待序列,等到另外一個線程調用notify()或者notifyAll()激活
當前線程必須擁有當前對象的monitor,就是鎖。線程調用wait(),釋放對鎖的擁有權,等待另外的線程來通知他,這樣才能重新獲得鎖的擁有權和恢復執行。
要確保調用wait()方法的時候擁有鎖。
調用Object.wait()方法,會釋放對象的鎖。調用Thread.sleep()方法,不會釋放對象的鎖。
notify():
喚醒一個等待當前對象的鎖的線程,如果多個線程在等待,他們中的一個將會被選擇喚醒,這種選擇是隨意的。
被喚醒的鎖是不能被執行的,必須要等到當前線程放棄這個對象的鎖,被喚醒的線程和其他線程競爭鎖。
一個線程擁有一個對象的鎖有以下幾種方法:
1.執行這個對象的synchronized實例方法
2.執行這個對象的synchronized語句塊,這個語句塊鎖的是這個對象
3.對於class類的對象,執行那個類的synchronized static方法
多線程編程-- part 4 線程間的通信