wait()
方法是 Java 中的一个重要方法,主要用于线程间的通信和协作。它在 Object
类中定义,因此所有 Java 对象都可以使用这个方法。当在一个线程中调用某个对象的 wait()
方法时,该线程会释放该对象的锁(如果已经获取了锁),然后进入等待状态,直到其他线程调用同一个对象的 notify()
或 notifyAll()
方法唤醒它。
以下是一些使用 wait()
方法的典型场景:
生产者-消费者问题:生产者线程生产数据并将其放入共享缓冲区(如队列或数组),消费者线程从共享缓冲区中取出数据进行消费。在这种情况下,当缓冲区为空时,消费者线程应该调用 wait()
方法等待,直到生产者线程生产数据并放入缓冲区。同样,当缓冲区已满时,生产者线程应该调用 wait()
方法等待,直到消费者线程消费数据并清空缓冲区。
线程同步:当多个线程需要访问共享资源(如文件、数据库连接等)时,可以使用 wait()
和 notify()
或 notifyAll()
方法来实现线程间的同步。例如,当一个线程正在访问共享资源时,其他线程应该调用 wait()
方法等待,直到当前线程完成操作并释放资源。
以下是一个简单的示例,展示了如何使用 wait()
和 notify()
方法实现生产者-消费者问题:
class Buffer {
private int data;
private boolean empty = true;
public synchronized void put(int data) throws InterruptedException {
while (!empty) {
wait(); // 等待,直到缓冲区为空
}
this.data = data;
empty = false;
notify(); // 唤醒等待的消费者线程
}
public synchronized int get() throws InterruptedException {
while (empty) {
wait(); // 等待,直到缓冲区非空
}
empty = true;
notify(); // 唤醒等待的生产者线程
return data;
}
}
请注意,在使用 wait()
方法时,必须确保线程在正确的条件下调用它,否则可能会导致死锁。通常,需要在 while
循环中调用 wait()
方法,以便在条件不满足时重复检查条件。此外,调用 wait()
方法时应该始终在同步块或同步方法中,以确保线程安全。