Java中sleep() 和 wait() 有什么區別?
sleep()
和 wait()
是兩個在 Java 中用于線程控制的方法,它們有一些重要的區別:
-
關聯對象:
-
sleep()
是Thread
類的靜態方法,它讓當前線程休眠指定的時間,不釋放對象鎖。 -
wait()
是Object
類的方法,它用于在同步塊內,暫時釋放對象的鎖,并等待其他線程通知或中斷。
-
-
調用方式:
-
sleep()
可以直接通過Thread.sleep()
調用。 -
wait()
必須在同步塊(synchronized block)內調用,因為它會釋放對象鎖,而在同步塊外調用會導致IllegalMonitorStateException
異常。
-
-
使用場景:
-
sleep()
主要用于線程間的時間調度,讓線程休眠一段時間。 -
wait()
主要用于線程間的協作,允許一個線程等待另一個線程通知它。
-
下面是一個簡單的示例,演示了 sleep()
和 wait()
的用法:
public class SleepWaitExample {public static void main(String[] args) {final Object lock = new Object();// sleep 示例Thread sleepThread = new Thread(() -> {synchronized (lock) {System.out.println("SleepThread is going to sleep...");try {Thread.sleep(2000); // 休眠2秒} catch (InterruptedException e) {e.printStackTrace();}System.out.println("SleepThread has awakened.");}});// wait 示例Thread waitThread = new Thread(() -> {synchronized (lock) {System.out.println("WaitThread is waiting...");try {lock.wait(); // 等待被喚醒} catch (InterruptedException e) {e.printStackTrace();}System.out.println("WaitThread has been notified.");}});sleepThread.start();waitThread.start();try {Thread.sleep(1000); // 等待一秒,確保 sleepThread 和 waitThread 同時執行} catch (InterruptedException e) {e.printStackTrace();}synchronized (lock) {System.out.println("Main thread notifies waiting thread.");lock.notify(); // 喚醒 waitThread}}
}
在上述示例中,SleepThread
使用 Thread.sleep()
進行休眠,而 WaitThread
使用 lock.wait()
進行等待。主線程在一秒后喚醒了 WaitThread
。這展示了 sleep()
用于時間調度,而 wait()
用于線程協作。