Java 为什么我得到非法监视器异常

Java 为什么我得到非法监视器异常,java,Java,我收到一个非法的监视器异常。我在谷歌上搜索了一下,但没有任何东西能说明我做错了什么 从这个normalclass中,我为另一个类创建了一个对象,并将该对象交给thread并同步线程。为什么我会得到这个例外 /* synchronize the thread object a */ /* here iam calling wait on thread as it need to complete run */ public class Normalclass { public

我收到一个非法的监视器异常。我在谷歌上搜索了一下,但没有任何东西能说明我做错了什么

从这个normalclass中,我为另一个类创建了一个对象,并将该对象交给thread并同步线程。为什么我会得到这个例外

/* 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
在您的示例中,notify在NormalThread k对象上调用,而wait在Thread a对象上调用。您应该在同一对象上调用这些方法,以便信号传播

您可以通过抓取监视器获取k来修复问题,以通过使用以下方法避免异常:

synchronized(this) {
    notify();
}
但坦率地说,这个例子毫无意义。通常情况下,你试图完成的事情都是用电脑完成的。按照javadoc的方法:

等待此线程死亡


与其用谷歌搜索,你应该做的第一件事是仔细查找和阅读!异常IllegalMonitorStateException的javadocs和方法java.lang.Object::wait和java.lang.Object::notify。但是链接的问答解释了这个问题。谢谢你,卡罗尔,加入会起作用。但是在我的应用程序中,我正在调用加入,小程序挂起了
Thread a = new Thread(k);
a.start();
a.join();