在JAVA的學習中,不少人會把 sleep和 wait搞混,認為都是做線程的等待,下面主要介紹下這倆者是什麼,及瞭解它們之間的差異和相似之處。
一般差異
簡單來說, wait()是一個用於 線程同步的實例方法。它可以在任何對象上調用,因為它定義在 java.lang.Object上, 但只能從 同步塊中調用。它釋放對象上的鎖,以便另一個線程可以跳入並獲取鎖。 另一方面, Thread.sleep()是可以從任何上下文調用的靜態方法。Thread.sleep()暫停 當前線程,不釋放任何鎖。
主要區別
sleep()線程控制自身流程。 wait()用來線程間通信,使擁有該對象鎖的線程等待直到指定時間或notify()。
wait()會釋放鎖和監視器, sleep()不釋放任何鎖或監視器等。 wait()用於線程間通信,而 sleep()用於在執行時引入暫停。
適用區域, wait只能放在 同步語句塊中才有意義。
注意事項
wait可以代替sleep嗎?
不可以,如果直接調用 wait會拋出 java.lang.IllegalMonitorStateException異常,原因是還沒有得到 對象鎖,所以無法釋放鎖。
如何獲取鎖?
執行對象的 synchronized實例方法。
執行對象對應類的 synchronized靜態方法。
執行對該對象加 synchronized的同步代碼塊。
演示
Thread.sleep
運行此示例一共將一共耗時 10S,因 T1線程獲得鎖後會暫停執行,這時候 LOCK依舊在 T1線程中,然後才會被 T2線程獲取
Object.wait
運行此示例會立即輸出 T1/T2beginwait... 但永遠不會輸出 T1/T2endwait...,因為沒有線程調用 LOCK.notify/notifyAll將它們喚醒
結論
調用:
wait():對象調用,當前線程必須在持有鎖的對象上進行同步。
sleep():線程調用,始終執行的當前線程。
同步:
wait():同步多個線程同時訪問一個對象時
sleep():多個線程同步等待線程休眠
鎖:
wait():釋放鎖,其它線程有機會執行
sleep():持有鎖,固定時間後釋放或被打斷(interrupt)
喚醒條件:
wait():直到調用對象的notify、notifyAll
sleep():直到至少時間到期或者調用interrupt()
使用:
sleep():用於時間同步
wait():用於多線程同步
Java程序員學習交流群515675832,既有技術大佬,又有老司機開車,各位對Java感興趣的可以來交流學習一下,快樂與技術一起進步