java 线程和Exception问题

来源:百度知道 编辑:UC知道 时间:2024/09/23 09:27:45
public class Text
{
public static void main(String[] agrs)
{
Text a=new Text();
a.waitForSignal();
}
void waitForSignal() //throws Exception
{
Object obj = new Object();
synchronized(Thread.currentThread())
{

try
{

obj.wait();
}
catch (Exception e) { }
obj.notify();;
}
}
}

这里结果为甚麽会抛出一个IllegalMonitorStateException,是什么东西引发的呢?请详细说明一下,谢谢!

JDK API 是这种问题的最好老师:你可以查看一下 Object 的API:
public final void wait()
throws InterruptedException
在其他线程调用此对象的 notify() 方法或 notifyAll() 方法前,导致当前线程等待。换句话说,此方法的行为就好像它仅执行 wait(0) 调用一样。
当前线程必须拥有此对象监视器。该线程发布对此监视器的所有权并等待,直到其他线程通过调用 notify 方法,或 notifyAll 方法通知在此对象的监视器上等待的线程醒来。然后该线程将等到重新获得对监视器的所有权后才能继续执行。

对于某一个参数的版本,实现中断和虚假唤醒是可能的,而且此方法应始终在循环中使用:

synchronized (obj) {
while (<condition does not hold>)
obj.wait();
... // Perform action appropriate to condition
}
此方法只应由作为此对象监视器的所有者的线程来调用。有关线程能够成为监视器所有者的方法的描述,请参阅 notify 方法。

抛出:
IllegalMonitorStateException - 如果当前线程不是此对象监视器的所有者。
InterruptedException - 如果在当前线程等待通知之前或者正在等待通知时,任何线程中断了当前线程。在抛出此异常时,当前线程的中断状态 被清除。
另请参见:
notify(), notifyAll()

错误原因:你并没有获得 obj 的对象监视器,这样改动就不会出那个异常了,但程序陷入假死状态,程序逻辑有问题:
synchronized(obj){
try{
obj.wait();
}
catch (Exception e) { }
o