wait()
和 sleep()
都是 Java 中用于暫停當前線程執行的方法,但它們之間存在一些關鍵區別:
所屬類:wait()
是 Object
類的方法,而 sleep()
是 Thread
類的方法。因此,所有 Java 類都繼承自 Object
類,所以所有類都可以使用 wait()
方法。但是,要使用 sleep()
方法,需要將當前類擴展為 Thread
類或實現 Runnable
接口。
釋放鎖:wait()
方法會釋放對象的鎖,使得其他線程可以使用同步塊或同步方法。當其他線程調用相同對象的 notify()
或 notifyAll()
方法時,調用 wait()
的線程才會重新獲得鎖并繼續執行。而 sleep()
方法不會釋放鎖,它會導致當前線程進入阻塞狀態,但在阻塞期間,其他線程仍然可以訪問該對象的其他部分。
拋出異常:wait()
方法可以拋出 InterruptedException
異常,而 sleep()
方法也可以拋出 InterruptedException
異常。當線程在 wait()
或 sleep()
期間被中斷時,會拋出此異常。
使用場景:wait()
和 notify()
通常用于多線程之間的協作,例如生產者-消費者問題。當一個線程生產了一個產品并將其放入共享緩沖區時,它會調用 notify()
通知消費者線程可以消費該產品。消費者線程在嘗試消費產品之前,需要調用 wait()
等待通知。而 sleep()
方法通常用于讓線程暫停一段時間,例如模擬長時間運行的任務或延遲執行。
總結一下,wait()
和 sleep()
的主要區別在于它們所屬類、鎖釋放和異常處理。wait()
用于多線程之間的協作,需要與 notify()
或 notifyAll()
配合使用;而 sleep()
用于讓線程暫停一段時間,不需要與其他線程協作。