java 如何通知线程
线程通知的基本方法
在 Java 中,线程间通知主要通过 wait()、notify() 和 notifyAll() 方法实现,这些方法属于 Object 类,需在同步代码块或同步方法中调用。
wait()
使当前线程进入等待状态,释放对象锁,直到其他线程调用 notify() 或 notifyAll() 唤醒它。
synchronized (lockObject) {
while (conditionNotMet) {
lockObject.wait(); // 释放锁并等待
}
// 条件满足后继续执行
}
notify()
随机唤醒一个等待该对象锁的线程。
synchronized (lockObject) {
conditionMet = true;
lockObject.notify(); // 唤醒一个等待线程
}
notifyAll()
唤醒所有等待该对象锁的线程。
synchronized (lockObject) {
conditionMet = true;
lockObject.notifyAll(); // 唤醒所有等待线程
}
使用 Condition 接口(高级场景)
java.util.concurrent.locks.Condition 提供了更灵活的线程通知机制,通常与 ReentrantLock 配合使用。
示例代码

ReentrantLock lock = new ReentrantLock();
Condition condition = lock.newCondition();
// 等待线程
lock.lock();
try {
while (conditionNotMet) {
condition.await(); // 类似 wait()
}
} finally {
lock.unlock();
}
// 通知线程
lock.lock();
try {
conditionMet = true;
condition.signal(); // 类似 notify()
// 或 condition.signalAll();
} finally {
lock.unlock();
}
注意事项
- 同步范围:
wait()和notify()必须在同步块内调用,否则会抛出IllegalMonitorStateException。 - 虚假唤醒:
wait()可能因操作系统原因被意外唤醒,建议用循环检查条件。 - 性能考量:
notifyAll()会唤醒所有线程,可能引发竞争,非必要时应优先使用notify()。
通过合理选择上述方法,可以实现高效的线程间协作。






