在Thread的run()方法中调用wait()

时间:2012-02-07 01:50:12

标签: java

我很好奇为什么这不起作用?我收到了IllegalMonitorStateException。这是Runnable的run方法,它已封装在Thread中并已启动。

public void run()
{
    while(true)
    {
        System.out.println("Hello World"); 

        synchronized(Thread.currentThread())
        {
            try{
                wait();     
            }  
            catch (InterruptedException e){}
        }
    }
}

2 个答案:

答案 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)以避免例外。