我收到了非法的监视器异常。我用谷歌搜索,但没有任何资料可以弄清楚我做错了什么。
从这个普通类中,我为其他类创建一个对象,并将该对象赋予线程并同步该线程。为什么会出现此异常?
/* 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
答案 0 :(得分:1)
在您的示例中,在notify()
对象上调用NormalThread k
,而在wait()
对象上调用Thread a
。您应该在同一对象上调用这些方法以使信号传播。
您可以通过抓住k
的显示器来解决问题,以免发生异常,方法是:
synchronized(this) {
notify();
}
但是坦率地说,这个例子没有什么意义。通常,您尝试完成的工作是通过Thread.join()
完成的。按照方法javadoc:
等待该线程死亡。
Thread a = new Thread(k);
a.start();
a.join();