本文中的示例代码可以在这里查看。
Java中使用Object
类中的wait()
、notify()
和notifyAll()
方法进行线程间通信,这三个方法都必须在同步块中执行。
synchronized (this) {
try {
this.wait();
// this.notify();
// this.notifyAll();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
当某个线程调用对象的wait()
方法后会释放线程持有的锁并阻塞,直到被其它线程通过notify()
或notifyAll()
方法唤醒。notify()
方法会随机唤醒一个阻塞的线程,而notifyAll()
则会唤醒所有阻塞的线程。线程被唤醒后需要竞争对象的锁,一旦获取了锁就可以从wait()
恢复,继续执行之后的代码。当线程退出同步块后,剩下被唤醒的线程会继续竞争对象的锁,直到所有线程执行完毕。