我注意到,需要在同步代码块或synchronized方法中调用Thread wait()方法。没有它,它正在抛出
java.lang.IllegalMonitorStateException
。为什么呢?
答案 0 :(得分:0)
请参阅Object.wait的javadoc。
http://docs.oracle.com/javase/1.5.0/docs/api/java/lang/Object.html#wait()
“当前线程必须拥有此对象的监视器。该线程释放此监视器的所有权并等待,直到另一个线程通过调用notify方法或notifyAll方法通知等待此对象监视器的线程唤醒。然后等待,直到它可以重新获得监视器的所有权并恢复执行。“
答案 1 :(得分:0)
public synchronized guardedJoy() {
// This guard only loops once for each special event, which may not
// be the event we're waiting for.
while(!joy) {
try {
wait();
} catch (InterruptedException e) {}
}
System.out.println("Joy and efficiency have been achieved!");
}
为什么这个版本的guardedJoy会同步?假设d是我们用来调用wait的对象。当一个线程调用d.wait时,它必须拥有d的内部锁 - 否则抛出错误。在synchronized方法中调用wait是获取内部锁的一种简单方法。
您遇到的错误是他们在示例中引用的错误。
答案 2 :(得分:0)
@synchronized(Obj){...}就像: SynchronizedObject.lock()... SynchronizedObject.Unlock()
等待基本简称: SynchronizedObject.Unlock()& SynchronizedObject.Lock()
使IMO更清晰......你需要锁才能释放它