我刚接触操作系统/多线程,我想知道wait()
和notify()
是如何协同工作的。我刚刚看到了这个:Producer Consumer Solution in Java
我有点困惑。假设我在PC.consume()
方法中调用了wait()
。当我到达PC.produce()
中的notify()
行时,PC.consume()
中的这个等待如何知道这就是被通知的那个?可能还有其他地方可以通知,那么它如何准确地知道通知哪些地方呢?
谢谢!
发布于 2018-08-17 08:35:30
Wait和notify是在同一个对象上调用的,这个对象被用作一个锁(在本例中,它是由局部变量pc引用的对象)。javadoc中使用的术语(这里是notify方法的api文档的开头)是“monitor”:
唤醒正在等待此对象的监视器的单个线程。如果有任何线程正在等待这个对象,则选择其中一个线程进行唤醒。这种选择是任意的,由实现决定。线程通过调用其中一个wait方法在对象的监视器上等待。
操作系统有一个线程调度器,它做出javadoc中描述的任意决策,它决定线程何时进行上下文切换或谁得到通知。
因此,当使用中的线程等待时,它就会进入休眠状态。然后,最终某个其他线程(在本例中只有两个线程获取pc上的锁)在第一个线程调用wait on的同一对象上调用notify,调度器挑选要通知的线程(必须是这里的第一个线程,因为没有其他线程在等待),被通知的线程醒来并检查是否有要使用的东西,以便它可以知道是否继续。
https://stackoverflow.com/questions/51886890
复制相似问题