java中的Object
类包含三个最终方法,允许线程就资源的锁状态进行通信。这些方法是wait()
,notify()
和notifyAll()
。在这篇文章中将学习wait
,notify
和notifyAll
。
在对象上调用这些方法的当前线程应该具有对象监视器,否则它会抛出java.lang.IllegalMonitorStateException
异常。
wait
对象等待方法有三个变体,一个等待无限期地等待任何其他线程调用对象上的notify
或notifyAll
方法来唤醒当前线程。其他两个差异使当前线程在唤醒之前等待特定的时间量。
notify
notify()
方法只唤醒一个等待该对象的线程,该线程开始执行。因此,如果有多个线程在等待对象,则此方法将仅唤醒其中一个。要唤醒的线程的选择取决于线程管理的OS实现。
notifyAll
notifyAll()
方法唤醒等待对象的所有线程,尽管首先处理哪个线程取决于OS实现。
这些方法可用于实现生产者消费者问题,其中消费者线程正在等待队列中的对象,生产者线程将对象放入队列并通知等待的线程。
让我们看一个多线程在同一个对象上工作的例子,这里将使用wait
,notify
和notifyAll
方法。
Message
线程将在其上工作的java bean类,并调用wait()
和notify()
方法。
Waiter
将等待其他线程调用notify()
类以完成其处理的类。请注意,Waiter
线程使用synchronized
块在Message
对象上拥有监视器。
Message
将在Message
对象上处理然后调用notify
方法以唤醒等待Message
对象的线程的类。请注意,synchronized
块用于拥有Message
对象的监视器。
WaitNotifyTest
测试类将创建Waiter
和Notifier
的多个线程并启动它们。
当调用上面的程序时将看到下面的输出,但程序将无法完成,因为有两个线程正在等待Message
对象而notify()
方法只唤醒其中一个,另一个线程仍在等待通知。
如果注释notify()
调用并取消注释Notifier
类中的notifyAll()
调用,下面将是生成的输出。
由于notifyAll()
方法唤醒了Waiter
线程并且程序完成并在执行后终止。这就是在java中wait
,notify
和notifyAll
方法全部内容。