Java中的wait()方法是Object类中的一个方法,用于实现线程间的同步,当一个线程调用wait()方法时,它会释放当前对象上的锁,并进入等待状态,直到另一个线程调用该对象的notify()或notifyAll()方法,将其唤醒,以下是关于wait()方法的使用详细介绍:

wait()方法的基本使用
| 方法签名 | 说明 |
|---|---|
public final void wait() |
使当前线程等待,直到另一个线程调用该对象的notify()或notifyAll()方法。 |
public final void wait(long timeout) |
使当前线程等待指定的时间(以毫秒为单位),直到另一个线程调用该对象的notify()或notifyAll()方法,或者线程等待超时。 |
public final void wait(long timeout, int nanos) |
使当前线程等待指定的时间(以毫秒为单位)加上指定的纳秒数,直到另一个线程调用该对象的notify()或notifyAll()方法,或者线程等待超时。 |
使用wait()方法的注意事项
wait()方法必须在同步代码块或同步方法内部调用,否则会抛出IllegalMonitorStateException异常。- 调用
wait()方法后,当前线程会释放对象的锁,等待其他线程唤醒它。 - 当另一个线程调用
notify()或notifyAll()方法时,被唤醒的线程会尝试重新获取对象的锁,如果成功,则继续执行;如果失败,则继续等待。 wait()方法会导致当前线程进入等待状态,直到被唤醒或等待超时。
示例代码
以下是一个使用wait()方法的简单示例:
public class WaitExample {
private Object lock = new Object();
public void method1() {
synchronized (lock) {
try {
System.out.println("Thread 1 is waiting");
lock.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("Thread 1 is awake");
}
}
public void method2() {
synchronized (lock) {
System.out.println("Thread 2 is notifying");
lock.notify();
}
}
public static void main(String[] args) {
WaitExample example = new WaitExample();
Thread t1 = new Thread(example::method1);
Thread t2 = new Thread(example::method2);
t1.start();
t2.start();
}
}
在这个示例中,线程1(method1)调用wait()方法,释放锁并等待,线程2(method2)调用notify()方法,唤醒线程1,并获取锁继续执行。

FAQs
-
问:为什么使用
wait()方法时需要在同步代码块或同步方法内部调用?
答:因为wait()方法需要释放当前线程持有的锁,以便其他线程可以访问该对象,如果不在同步代码块或同步方法内部调用,则会抛出IllegalMonitorStateException异常。 -
问:如何避免在
wait()方法中发生死锁?
答:为了避免死锁,可以采取以下措施:
- 确保所有线程都遵循相同的锁获取顺序。
- 使用超时参数调用
wait()方法,这样即使线程无法获得锁,也不会无限期地等待。 - 在调用
wait()方法之前,检查所需条件是否满足,如果条件不满足,则不调用wait()方法。
原创文章,发布者:酷盾叔,转转请注明出处:https://www.kd.cn/ask/202900.html