📅  最后修改于: 2023-12-03 15:16:19.114000             🧑  作者: Mango
在Java中,线程之间的通信是一种非常重要的机制。Java提供了两个非常有用的方法wait()和notifyAll(),用于实现线程间的协作和同步。本文将介绍这两个方法的区别。
wait()方法是指当前线程会进入等待状态,直到另一个线程调用notify()或notifyAll()方法才会被唤醒。在调用wait()方法时,当前线程必须先获得对象的锁。调用wait()方法后,当前线程会释放该对象的锁,直到被唤醒后再重新获取锁。wait()方法常常与synchronized关键字一起使用,用于实现线程间的同步。
下面是wait()方法的示例代码:
synchronized (obj) {
while (shouldWait()) {
try {
obj.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
在上面的代码中,如果shouldWait()为true,则当前线程会等待obj对象的notify()或notifyAll()方法的调用。
notifyAll()方法是唤醒所有正在等待该对象的线程。调用notifyAll()方法会重新唤醒所有因调用wait()方法而等待该对象的线程。notifyAll()方法也必须在获得该对象的锁后才能被调用。
下面是notifyAll()方法的示例代码:
synchronized (obj) {
setShouldWait(false);
obj.notifyAll();
}
在上面的代码中,调用notifyAll()方法后,所有正在等待该对象的线程都会被唤醒。
wait()方法和notifyAll()方法的主要区别在于:
在使用wait()方法和notifyAll()方法时,需要注意以下几个问题:
综上所述,wait()方法和notifyAll()方法是Java中非常重要的线程通信机制,用于实现线程间的协作和同步。程序员应该熟练掌握这两个方法的使用。