我了解到调用对象的wait()方法将释放对象监视器(如果存在)。
notify()但是我对另一个线程调用这个对象有一些疑问:
(何时)等待线程会唤醒,如果另一个(第三个)线程同时拥有对象监视器?
wait()如果在该对象上调用第三个线程,等待线程会唤醒吗?是否可以确定线程是否正在等待通知特定对象(java 1.4/java 5)
如果
wait()将在finalize()方法中调用会发生什么?
当您从线程调用 wait() 时,该线程停止执行并将其添加到对象的等待集中。当你从另一个线程调用 notify() 时,waitset 中的一个随机线程被唤醒,如果你调用 notifyAll(),所有线程都准备好执行。
当你调用 notify() 时,线程已准备好运行,但这并不意味着它会立即执行,所以要小心。
它会随机从等待集中唤醒一个线程。
你不知道哪个会先被唤醒,它不遵循任何顺序。
线程.getState()
你会产生死锁。
这就是为什么你有notify()andnotifyAll()方法。前者唤醒一个等待对象的线程,后者唤醒所有线程。wait()如果在另一个线程中调用,等待的线程将不会唤醒。
不。
只能调用thread.holdsLock(obj)以查看线程是否持有特定对象的监视器锁。
不要调用wait()finalize 方法。
notify将唤醒一个在监视器上等待的线程。除非并且直到监视器未被拥有,否则不会运行线程等待;wait() 必须在同步块中调用,因此必须持有锁才能继续运行该块。notifyAll给所有线程一个唤醒的机会。2:不一定。notify()唤醒其中一个等待线程。它可能是原始的或第三个。
3:使用thread.getState()你可以查出一个线程是否在等待一个对象,但我不知道你是否总能准确地找出这是哪个对象。