1. 程式人生 > >多線程編程-- part 4 線程間的通信

多線程編程-- part 4 線程間的通信

如果 方法 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 線程間的通信