sleep和wait的區別有:
1,這兩個方法來自不同的類分別是Thread和Object
2,最主要是sleep方法沒有釋放鎖,而wait方法釋放了鎖,使得其他線程可以使用同步控制塊或者方法。
3,wait,notify和notifyAll只能在同步控制方法或者同步控制塊里面使用,而sleep可以在
任何地方使用
synchronized(x){
x.notify()
//或者wait()
}
4,sleep必須捕獲異常,而wait,notify和notifyAll不需要捕獲異常
關於wait()暫停的是持有鎖的對象,所以想調用wait()必須為:對象.wait();
notify()喚醒的是等待鎖的對象,調用:對象.notify();
如下:
Object obj = newObject();
synchronized(obj){
try{
obj.wait();
}catch(Exception e){}
obj.notify();
}
注意:wait(),notify(),notifyAll()都必須使用在同步中,因為要對持有監視器(鎖)的線程操作。所以要使用在同步中,因為只有同步 才具有鎖。
為什么這些操作線程的方法要定義在object類中呢?
簡單說:因為synchronized中的這把鎖可以是任意對象,所以任意對象都可以調用wait()和notify();所以wait和notify屬於Object。
專業說:因為這些方法在操作同步線程時,都必須要標識它們操作線程的鎖,只有同一個鎖上的被等待線程,可以被同一個鎖上的notify喚醒,不可以對不同鎖中的線程進行喚醒。
也就是說,等待和喚醒必須是同一個鎖。而鎖可以是任意對象,所以可以被任意對象調用的方法是定義在object類中。