Java多线程中调用wait() 和 sleep()方法有什么不同?
在Java多线程编程中,wait()
和 sleep()
方法有着不同的用途和行为。以下是它们之间的主要区别:
wait()
: 是 Object
类的方法。它是用来在同步块或同步方法中使当前线程等待,直到其他线程调用 notify()
或 notifyAll()
方法。sleep()
: 是 Thread
类的静态方法。它使当前线程暂停执行指定的时间。wait()
: 当一个线程调用 wait()
方法时,它会释放持有的对象锁(即监视器锁),并进入等待状态,直到被其他线程唤醒。sleep()
: 当一个线程调用 sleep()
方法时,它不会释放持有的对象锁。即使线程在睡眠状态,其他线程仍然无法获得该锁。wait()
: 通常用于线程间的通信,特别是在生产者-消费者模式中。它允许一个线程在某个条件不满足时等待,并在条件满足时被唤醒。sleep()
: 通常用于控制线程的执行时间,比如在某些情况下需要让线程暂停一段时间,以便其他线程有机会执行。wait()
: 需要在同步块或同步方法中调用,并且会抛出 IllegalMonitorStateException
(如果线程没有持有对象的监视器锁)和 InterruptedException
(如果线程在等待时被中断)。sleep()
: 也会抛出 InterruptedException
,但不需要在同步块中调用。class Example {
private final Object lock = new Object();
public void waitExample() {
synchronized (lock) {
try {
// 线程等待
lock.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
public void sleepExample() {
try {
// 线程睡眠
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
wait()
时,线程会释放锁并等待其他线程的通知。sleep()
时,线程会保持锁并在指定时间内暂停执行。理解这两者的区别对于编写高效和正确的多线程程序非常重要。