代码之家  ›  专栏  ›  技术社区  ›  MRalwasser

java:wait()、notify()和synchronized块

  •  8
  • MRalwasser  · 技术社区  · 15 年前

    我学会了调用对象的 wait()

    但是我有一些关于打电话的问题 notify() 另一个线程在此对象上:

    1. (何时)如果另一个(第三个)线程同时拥有对象监视器,等待的线程会唤醒吗?

    2. 如果第三个线程调用 等待() 在这个物体上?

    3. 如果发生了什么 将在 finalize() 方法?

    4 回复  |  直到 15 年前
        1
  •  2
  •   Borealid    15 年前
    1. notify 将唤醒一个在监视器上等待的线程。除非并且直到监视器无主,否则不能运行等待线程;wait()必须在同步块中调用,因此必须保持锁才能继续运行该块。
    2. notifyAll 给所有线程一个 机会 醒来。
        2
  •  3
  •   sui    15 年前

    从线程调用wait()时,该线程停止执行,并将其添加到对象的waitset中。当您从另一个线程调用notify()时,waitset中的一个随机线程被唤醒,如果您调用notifyAll(),则所有线程都将准备好执行。

    1. 它会随机从waitset中唤醒一个线程。

    2. Thread.getState()

        3
  •  2
  •   Chris Dennett    15 年前
    1. 所以你才有 notify() notifyAll() wait()

    2. 不。

    3. 只能打电话 thread.holdsLock(obj) 查看线程是否持有特定对象上的监视器锁。

    4. 等待() 在finalize方法中。

        4
  •  0
  •   Martijn    15 年前

    notify() 醒来 等待线程的数目。它可能是原来的一个或第三个。

    thread.getState() 你可以找出一个线程是否在等待一个对象,但我不知道你是否总能找到这个对象。