8

我了解到调用对象的wait()方法将释放对象监视器(如果存在)。

notify()但是我对另一个线程调用这个对象有一些疑问:

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

  2. wait()如果在该对象上调用第三个线程,等待线程会唤醒吗?

  3. 是否可以确定线程是否正在等待通知特定对象(java 1.4/java 5)

  4. 如果wait()将在finalize()方法中调用会发生什么?

4

4 回答 4

3

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

当你调用 notify() 时,线程已准备好运行,但这并不意味着它会立即执行,所以要小心。

  1. 它会随机从等待集中唤醒一个线程。

  2. 你不知道哪个会先被唤醒,它不遵循任何顺序。

  3. 线程.getState()

  4. 你会产生死锁。

于 2010-07-06T22:14:05.343 回答
2
  1. 这就是为什么你有notify()andnotifyAll()方法。前者唤醒一个等待对象的线程,后者唤醒所有线程。wait()如果在另一个线程中调用,等待的线程将不会唤醒。

  2. 不。

  3. 只能调用thread.holdsLock(obj)以查看线程是否持有特定对象的监视器锁。

  4. 不要调用wait()finalize 方法。

于 2010-07-06T22:10:03.367 回答
2
  1. notify将唤醒一个在监视器上等待的线程。除非并且直到监视器未被拥有,否则不会运行线程等待;wait() 必须在同步块中调用,因此必须持有锁才能继续运行该块。
  2. 没有保证。调用notifyAll给所有线程一个唤醒的机会。
  3. 不知道。你可以让线程设置一个变量,说它在进入睡眠之前正在等待......
  4. 这可能是个坏主意。你能想出一个必要的情况吗?
于 2010-07-06T22:11:50.560 回答
0

2:不一定。notify()唤醒其中一个等待线程。它可能是原始的或第三个。

3:使用thread.getState()你可以查出一个线程是否在等待一个对象,但我不知道你是否总能准确地找出这是哪个对象。

于 2010-07-06T22:10:44.617 回答