我很好奇为什么这不起作用?我收到了IllegalMonitorStateException。这是Runnable的run方法,它已封装在Thread中并已启动。
public void run()
{
while(true)
{
System.out.println("Hello World");
synchronized(Thread.currentThread())
{
try{
wait();
}
catch (InterruptedException e){}
}
}
}
答案 0 :(得分:8)
您在拥有另一个对象的监视器(wait()
的结果)时,在一个对象(Runnable
)上调用Thread.currentThread()
。您必须拥有监视器(synchronize
)与您呼叫wait()
的相同对象。所以这不会导致错误:
public void run() {
synchronized(this) {
try {
wait();
} catch (InterruptedException e) { }
}
}
答案 1 :(得分:4)
根据wait()的javadoc:
IllegalMonitorStateException - if the current thread is not the owner of the object's monitor.
当您调用wait()时,您将在Runnable实例上调用它。由于您的同步块在当前线程上而不在this
上,因此您不保持当前实例的锁定。您应该将代码更改为synchronized(this)
以避免例外。