为什么我会收到`IllegalMonitorStateException`异常

时间:2014-03-31 11:29:42

标签: java multithreading

我有以下Java代码:

public class Lean extends Thread   
{
    public static void main(String args[]) throws InterruptedException  
    {
        Lean lean = new Lean();
        System.out.println("starting");
        lean.start();
        lean.join();
        System.out.println("end");

    }

    public void run()
    {
        try
        {
            System.out.println("waiting");
            wait(20000);
        } 
        catch (InterruptedException e)
        {
            e.printStackTrace();
        }
        finally
        {
            System.out.println("waiting finished");
        }
    }
}

输出是(不断变化 - 有时我甚至看不到“结束”打印)

starting
waiting
waiting finished
end
Exception in thread "Thread-1" java.lang.IllegalMonitorStateException
    at java.lang.Object.wait(Native Method)
    at Lean.run(Lean.java:18)

问题:

  1. 为什么我会IllegalMonitorStateException例外?

  2. 为什么thread.join不按照预期的方式工作? (我看不到有时打印“结束”)

1 个答案:

答案 0 :(得分:6)

如果在不保持监视器锁定的情况下调用需要同步的操作,则抛出

IllegalMonitorStateException。需要在同步块中调用wait

documentation for wait covers this

基本上你需要这样做:

synchronized(this) {
    wait();
}

这与中断机制无关。