收到这些电话的notify()/ notifyAll()?

时间:2014-06-30 13:14:29

标签: java wait synchronized notify

当我在方法中写notify()或notifyAll时。 谁接到这些电话?

  1. 来自同一班级的所有其他对象实例?
  2. 包含我们从他的一个方法调用的对象到notify()/ notifyAll()调用的对象?
  3. 每个班级中处于wait()状态的每个对象?

3 个答案:

答案 0 :(得分:1)

notifyAll() - >所有在Object上等待的线程

notify() - >正在等待Object的线程(如果有多个线程,那么它将是其中之一,但你无法控制哪一个)

答案 1 :(得分:0)

当我在方法中编写notify()或notifyAll时。谁接到这些电话?

One / All threads waiting setnotify() / notifyAll()所针对的对象{{1}}。

答案 2 :(得分:0)

(警告:以下内容可能过于简单化......)

首先,理解a monitor的概念很重要,另请参阅http://www.artima.com/insidejvm/ed2/threadsynch.html粗略地说,监视器是一个允许您强制互斥其代码的对象,即at每个时间点,最多一个线程可能正在执行其任何方法(最后一句话是从提到的维基百科文章中窃取的)。为此,需要对锁定和信令等提供一些支持,synchronizedwaitnotify是Java支持监视器实现的方法。

此外,还要记住Java线程的生命周期,请参阅http://www.uml-diagrams.org/examples/java-6-thread-state-machine-diagram-example.htmlhttp://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()的缩写。