初學者如何在學Java過程中理解sleep與wait的差異!

編程語言 Java 程序員 技術 不動蝸牛 不動蝸牛 2017-10-14

在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

初學者如何在學Java過程中理解sleep與wait的差異!

運行此示例一共將一共耗時 10S,因 T1線程獲得鎖後會暫停執行,這時候 LOCK依舊在 T1線程中,然後才會被 T2線程獲取

初學者如何在學Java過程中理解sleep與wait的差異!

Object.wait

初學者如何在學Java過程中理解sleep與wait的差異!

運行此示例會立即輸出 T1/T2beginwait... 但永遠不會輸出 T1/T2endwait...,因為沒有線程調用 LOCK.notify/notifyAll將它們喚醒

初學者如何在學Java過程中理解sleep與wait的差異!

結論

調用:

wait():對象調用,當前線程必須在持有鎖的對象上進行同步。

sleep():線程調用,始終執行的當前線程。

同步:

wait():同步多個線程同時訪問一個對象時

sleep():多個線程同步等待線程休眠

鎖:

wait():釋放鎖,其它線程有機會執行

sleep():持有鎖,固定時間後釋放或被打斷(interrupt)

喚醒條件:

wait():直到調用對象的notify、notifyAll

sleep():直到至少時間到期或者調用interrupt()

使用:

sleep():用於時間同步

wait():用於多線程同步

初學者如何在學Java過程中理解sleep與wait的差異!

Java程序員學習交流群515675832,既有技術大佬,又有老司機開車,各位對Java感興趣的可以來交流學習一下,快樂與技術一起進步

相關推薦

推薦中...