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