Java 在线程的run()方法中调用wait()
我很好奇为什么这不起作用?我得到一个非法的监视器状态例外。这是已封装在线程中并已启动的Runnable的run方法Java 在线程的run()方法中调用wait(),java,Java,我很好奇为什么这不起作用?我得到一个非法的监视器状态例外。这是已封装在线程中并已启动的Runnable的run方法 public void run() { while(true) { System.out.println("Hello World"); synchronized(Thread.currentThread()) { try{ wait();
public void run()
{
while(true)
{
System.out.println("Hello World");
synchronized(Thread.currentThread())
{
try{
wait();
}
catch (InterruptedException e){}
}
}
}
根据javadoc,针对:
调用wait()时,您正在可运行实例上调用它。由于同步块在当前线程上,而不是在this
上,因此您不持有当前实例的锁。您应该将代码更改为synchronized(this)
,以避免出现异常。根据javadoc:
调用wait()时,您正在可运行实例上调用它。由于同步块在当前线程上,而不是在this
上,因此您不持有当前实例的锁。您应该将代码更改为“已同步”(this),以避免出现异常。您在拥有另一个对象(Thread.currentThread()。监视器(synchronize
on)必须与调用wait()
on的对象相同。因此,这不会导致错误:
public void run() {
synchronized(this) {
try {
wait();
} catch (InterruptedException e) { }
}
}
您正在一个对象上调用wait()
,同时拥有另一个对象的监视器(Thread.currentThread()
)。监视器(synchronize
on)必须与调用wait()
on的对象相同。因此,这不会导致错误:
public void run() {
synchronized(this) {
try {
wait();
} catch (InterruptedException e) { }
}
}
和都有关于这方面的有用信息。你读过这些吗?如果没有,请这样做。如果是这样的话,那么这里显示的信息会让您感到困惑吗?另外,请查看这篇关于Java线程和监视器的优秀文章:我在检查和修复它之前就意识到了这一点。我的错误。谢谢你的资源,我一定会看的!和都有关于这方面的有用信息。你读过这些吗?如果没有,请这样做。如果是这样的话,那么这里显示的信息会让您感到困惑吗?另外,请查看这篇关于Java线程和监视器的优秀文章:我在检查和修复它之前就意识到了这一点。我的错误。谢谢你的资源,我一定会看的!