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()
用于线程协作。