为什么我要获得Illeagal Monitor异常

时间:2019-01-03 12:38:43

标签: java

我收到了非法的监视器异常。我用谷歌搜索,但没有任何资料可以弄清楚我做错了什么。

从这个普通类中,我为其他类创建一个对象,并将该对象赋予线程并同步该线程。为什么会出现此异常?

/* synchronize the thread object a */
/* here iam calling wait on thread as it need to complete run */     

public class Normalclass 
{
    public static void main(String[] args)
    {
        NormalThread k = new NormalThread();
        Thread a =new Thread(k);
        a.setName("test");
        a.start();

        synchronized(a){
          try{
            a.wait();
          } catch(InterruptedException e){
            System.out.println("exception");
          }
        }
    }
}

public class NormalThread implements Runnable
{
    public void run() 
    {
        for(int i=0;i<=100;i++)
        {
            System.out.println(i);
        }
        notify();
    }
}
/* here iam notifying after the run for loop completed*/      
//  Iam getting illegal monitor exception

1 个答案:

答案 0 :(得分:1)

在您的示例中,在notify()对象上调用NormalThread k,而在wait()对象上调用Thread a。您应该在同一对象上调用这些方法以使信号传播。

您可以通过抓住k的显示器来解决问题,以免发生异常,方法是:

synchronized(this) {
    notify();
}

但是坦率地说,这个例子没有什么意义。通常,您尝试完成的工作是通过Thread.join()完成的。按照方法javadoc:

  

等待该线程死亡。

Thread a = new Thread(k);
a.start();
a.join();