虽然我已经在synchronized块中写了等待。我得到了IllegalMonitorStateException
。那是什么原因?
package trials;
public class WaitNotifyTrial {
public static void main(String[] args){
Generator g=new Generator();
g.start();
System.out.println("Start");
synchronized (g) {
try {
g.wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
System.out.println("Printing exception");
e.printStackTrace();
}
System.out.println(g.value);
}
}
}
class Generator extends Thread{
int value;
public void run(){
synchronized (this) {
value=10;
}
notify();
}
}
}
答案 0 :(得分:6)
这些是你的代码有些问题:
notify()
之外致电synchronized (this)
(这是您的直接问题); wait-notify
个实例上使用Thread
机制,recommended against in its documentation; Thread
,而不是按原样使用该类,只传递Runnable
实施的实例。现在差不多整整十年了,一般的建议是完全避免使用wait-notify
机制,而是使用java.util.concurrent
中的同步辅助工具之一,例如CountDownLatch
。