在Java中,线程间通信主要依赖于对象的监视器(Monitor)机制,其中wait(), notify(), 和 notifyAll() 方法被广泛使用。这些方法必须在同步环境中调用,通常是同步块或同步方法。以下是使用这些通信机制的一个简单例子:
public class ThreadCommunicationExample {
private final Object lock = new Object();
private boolean dataIsReady = false;
public void waitForData() {
synchronized (lock) {
while (!dataIsReady) { // 注意这里的while循环
try {
lock.wait(); // 数据未准备好时,当前线程将进入等待状态
} catch (InterruptedException e) {
Thread.currentThread().interrupt(); // 处理中断异常
}
}
}
}
public void processData() {
synchronized (lock) {
dataIsReady = true;
lock.notifyAll(); // 唤醒所有等待在该监视器上的线程
}
}
}
在这个例子中,waitForData() 方法会被一个线程调用,该线程将等待直到 dataIsReady 变为 true。而另一个线程则会调用 processData() 方法,在数据准备好之后唤醒等待的线程。
注意几个要点:
1.wait() 方法使线程进入等待状态,并释放锁,直到另一个线程调用了同一监视器对象的 notify() 或 notifyAll() 方法。
2.notify() 方法随机唤醒一个等待在该监视器上的线程。
3.notifyAll() 唤醒所有等待在该监视器上的线程。
4.使用 wait() 和 notify() 需要处理 InterruptedException,因为 wait() 方法可能会抛出这个异常。
5.在调用 wait() 和 notify() 方法时,必须持有监视器对象的锁。
6.在使用 wait() 方法时,推荐使用循环条件来检查等待的条件是否满足,以避免假唤醒。
还有其他高级并发API可以用于线程间通信,如 java.util.concurrent 包下的 CountDownLatch, CyclicBarrier, Semaphore 等,这些类提供了更灵活的同步机制。