Java多线程:wait(),notify(),notifyAll()

时间:2022-05-24 15:42:53

1. wait(),notify(),notifyAll()

这三个方法是用于线程间通信的基础方法,但实际上,它们不是Thread类中的方法,而是Object类中的本地方法。因此,理论上任何对象都可以调用者三个方法。当然,实际编程中,只有同步锁对象调用这三种方法,才能完成多线程的线程间通信。通常情况下,如果是synchronized修饰的方法,这个对象是this,如果是其他特定的变量,则为被修饰的变量。

调用wait(),notify(),notifyAll()方法的线程必须获取同步锁对象的锁,即有对象的控制权,否则程序会报IllegalMonitorStateException。

2. wait()

2.1. wait()

使当前线程进入到阻塞状态直到其他线程通过notify()/notifyAll()来唤醒。

2.2. wait(long timeout)

在wait()的基础上,设置了一个超时时间,超过这个时间会自主唤醒。

2.3. wait(long timeout, int nanos)

由于wait(long timeout)中的timeout参数的单位是毫秒,该方法提供了更加精确的设置,但是并不是精确到纳秒,而是如果纳秒数大于nanos设定的值,则算作一毫秒。

3. notify()

唤醒在此同步锁对象上等待的单个线程。如果有多个线程都在此同步锁对象上等待,则会任意选择其中某个线程进行唤醒操作,只有当前线程放弃对同步锁对象的锁定,才有可能执行被唤醒的线程。

4. notifyAll()

和notify()的区别为唤醒同步锁对象上等待的所有线程。

5. 参考文章

Java总结篇系列:Java多线程(三)

Java总结篇系列:java.lang.Object