[size=medium]在学习中有时会出现wait()方法抛 IllegalMonitorStateException 的情况,查阅wait 方法的API时,对于 IllegalMonitorStateException 的说明如下:
[/size]
[quote] [color=darkblue]IllegalMonitorStateException - 如果当前线程不是此对象监视器的所有者。[/color] [/quote]
[size=medium]
从网上找来一段,自己改了改想了想,不敢说绝对正确,但确是自己的心得和理解(若有不正确的地方,恳请各位大侠指正吧...)[/size]
以下代码抛IllegalMonitorStateException
上例中,synchronized的对象是Thread.currentThread(),查阅currentThread()的说明如下:
[quote][color=darkblue]static Thread currentThread()
返回对当前正在执行的线程对象的引用。[/color] [/quote]
因为,Thread.currentThread()返回的当前线程的引用与当前线程,指向的是不同对象.
请看如下代码:
1.比较引用与equals方法都将返回Not equals
2.在上例中,之所以没有重写equals方法的原因是,Object对equals方法的定义如下:
所以没有必要重写.
以下代码进入wait状态,退出时按Ctrl+c,但是不抛IllegalMonitorStateException异常.
[size=medium]总结如下:
[color=blue]非当前线程的引用调用wait方法,抛IllegalMonitorStateException异常[/color][/size]
[/size]
[quote] [color=darkblue]IllegalMonitorStateException - 如果当前线程不是此对象监视器的所有者。[/color] [/quote]
[size=medium]
从网上找来一段,自己改了改想了想,不敢说绝对正确,但确是自己的心得和理解(若有不正确的地方,恳请各位大侠指正吧...)[/size]
以下代码抛IllegalMonitorStateException
class M018
{
public static void main(String[] args) throws Exception
{
M018 m18 = new M018();
m18.one();
}
public void one() throws Exception
{
Object obj = new Object();
synchronized (Thread.currentThread())
{
obj.wait();//当前线程是主线程(所有者是Object)
//obj.notify();
}
}
}
/**
*2010-3-26 下午23:30:59
*Conclusion:
IllegalMonitorStateException - 如果当前线程不是此对象监视器的所有者。
*/
上例中,synchronized的对象是Thread.currentThread(),查阅currentThread()的说明如下:
[quote][color=darkblue]static Thread currentThread()
返回对当前正在执行的线程对象的引用。[/color] [/quote]
因为,Thread.currentThread()返回的当前线程的引用与当前线程,指向的是不同对象.
请看如下代码:
import static java.lang.System.out;
class M019
{
public static void main(String[] args)
{
One o = new One();
Thread o1 = new Thread(o);
Thread o2 = o.getThread();
//o1.start();//将此行注释去除,执行正常
//o2.start();//将此行注释去除,抛IllegalMonitorStateException
if(o1==o2)
out.println("equals");
else
out.println("Not equals");
if(o1.equals(o2))
out.println("equals");
else
out.println("Not equals");
}
}
class One implements Runnable
{
public void run()
{
for(int i = 0; i < 10 ; i++)
{
out.print(i+" ");
}
}
public Thread getThread()
{
return Thread.currentThread();
}
}
/**
*2010-3-26 下午23:58:59
*Conclusion:
*/
1.比较引用与equals方法都将返回Not equals
2.在上例中,之所以没有重写equals方法的原因是,Object对equals方法的定义如下:
public boolean equals(Object obj) {
return (this == obj);
所以没有必要重写.
以下代码进入wait状态,退出时按Ctrl+c,但是不抛IllegalMonitorStateException异常.
//
import static java.lang.System.out;
class M018
{
public static void main(String[] args) throws Exception
{
M018 m18 = new M018();
m18.one(m18);
//System.out.println("Hello World!");
}
public void one(M018 n) throws Exception
{
Object obj = new Object();
synchronized (this)
{
n.wait();
}
}
}
/**
*2010-3-26 下午23:30:59
*Conclusion:
IllegalMonitorStateException - 如果当前线程不是此对象监视器的所有者。
*/
[size=medium]总结如下:
[color=blue]非当前线程的引用调用wait方法,抛IllegalMonitorStateException异常[/color][/size]