当我在方法中写notify()或notifyAll时。 谁接到这些电话?
答案 0 :(得分:1)
notifyAll() - >所有在Object上等待的线程
notify() - >正在等待Object的线程(如果有多个线程,那么它将是其中之一,但你无法控制哪一个)
答案 1 :(得分:0)
当我在方法中编写notify()或notifyAll时。谁接到这些电话?
One / All
threads
waiting set
中notify() / notifyAll()
所针对的对象{{1}}。
答案 2 :(得分:0)
(警告:以下内容可能过于简单化......)
首先,理解a monitor的概念很重要,另请参阅http://www.artima.com/insidejvm/ed2/threadsynch.html粗略地说,监视器是一个允许您强制互斥其代码的对象,即at每个时间点,最多一个线程可能正在执行其任何方法(最后一句话是从提到的维基百科文章中窃取的)。为此,需要对锁定和信令等提供一些支持,synchronized
,wait
和notify
是Java支持监视器实现的方法。
此外,还要记住Java线程的生命周期,请参阅http://www.uml-diagrams.org/examples/java-6-thread-state-machine-diagram-example.html和http://docs.oracle.com/javase/7/docs/api/java/lang/Thread.State.html另请参阅http://www.javatpoint.com/life-cycle-of-a-thread以获得简化的演示文稿。
现在,回答你的问题:
重要的是要认识到Java中的每个对象都可以变为监视器wait()
,notify()
,notifyAll()
继承自public class Object
,所有超类对象,请参阅http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html在这种情况下,对象本身就像锁一样。
因此,当我们说,例如notify()
时,这个定义不明确,而对某些对象o.notify()
应该是o
。但是,如果notify()
出现在对象的代码中,那么通常会将其解释为this.notify()
,这是它经常使用的方式(尽管它绝不仅限于此,参见,例如,http://www.programcreek.com/2009/02/notify-and-wait-example/中的第一个例子。
总结:
o.wait()
=>线程进入WAITING
状态并被添加到等待的对象集o
,o.notify()
=>等待对象集o
中的一个线程被选中并变为RUNNABLE
(即已准备好,但尚未运行),o.notifyAll()
=>如上所述,但等待集o
,wait()
或notify()
分别是this.wait()
和this.notify()
的缩写。