sleep和wait的區別


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類中。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM