sleep()方法和wait()方法之間有什么差異?


sleep()方法用被用於讓程序暫停指定的時間,而wait()方法被調用后,線程不會自動蘇醒,需要別的線程調用同一個對象上的notify()或者nofifyAl()方法

主要的區別是,wait()釋放鎖或監視器,然而sleep()不釋放任何鎖或監視器等。wait被用於線程間通信,而sleep一般來說被用於在執行時引入暫停。

Thread.sleep()讓當前線程進入不可運行狀態一段時間。線程繼續保持它所獲取的監視器——即如果線程當前處於同步塊或方法中,則沒有其他線程可以進入此塊或方法。如果另一個線程調用t.interrupt()會喚醒sleep的線程。注意,sleep()是一種靜態方法,這意味着它總是影響當前線程(執行睡眠方法的線程)。一個常見的錯誤是用t.sleep期望不同的線程休眠,但實際上是當前線程休眠。

object.wait()讓當前線程進入不可運行狀態,如sleep()一樣,但不同的是wait方法從一個對象調用,而不是從一個線程調用;我們稱這個對象為“鎖定對象(lockObj)”。在lockObj.wait()被調用之前,當前線程必須在lockObj上同步(synchronize);然后調用wait()后釋放這個鎖,並將線程增加到與lockObj相關的“等待名單(wait list)”。然后,另一個在同一個lockObj鎖定(synchronize)的方法可以調用lockObj.nofity()。這會喚醒原來等待的線程。基本上,wait() / notify()就像sleep() / interrupt(),只是活動線程不需要直接指向一個睡眠線程,他們只需要共享鎖對象(lockObj)。

synchronized(LOCK) {   
    Thread.sleep(1000); // LOCK is held
}

synchronized(LOCK) {   
    LOCK.wait(); // LOCK is not held
}

讓我們將上面的要點分類:

調用:

  • wait():在對象上調用,並且當前線程必須在一個lockObj上同步。
  • sleep():在Thread上調用,總是當前正在執行的線程。

同步:

  • wait():如果同步,那么多個線程會一個一個的訪問對象。
  • sleep():如果同步,多個線程都會等休眠線程蘇醒。

維持鎖:

  • wait():釋放鎖,讓其他對象機會執行。
  • sleep():執型超時或者調用interrupt之前保持鎖。

蘇醒條件:

  • wait():直到由對象調用notify(), notifyAll()
  • sleep():執型超時或者調用interrupt之前保持鎖。

用途:

  • sleep():時間同步;
  • wait():多線程同步。

 

希望以上信息能給你的知識庫增加一些價值。

Happy Learning !!

 


免責聲明!

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



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