我了解到调用对象的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()
你可以查出一个线程是否在等待一个对象,但我不知道你是否总能准确地找出这是哪个对象。