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 !!
