日期:2014-05-20  浏览次数:20682 次

一个菜鸟对线程的疑问
void waitForSignal(){
Object obj=new Object();
synchronized(Thread.currentThread()){
obj.wait();
obj.notify();
}
}


请问选什么,求解答。

------解决方案--------------------
A.wait方法可能会抛出InterruptedException异常,所以需要捕获,B编译按照A改可以通过,但是运行时肯定会报IllegalMonitorStateException,因为同步里的对象,才能使用.wait,所以想用obj当锁,应该改为synchronized(obj),两者需要一致。C.wait()没有参数会一直等待下去。D.先改A然后运行会报ClassCastException
E.线程还会等待,wait没有别的线程给它唤醒notify。
------解决方案--------------------
这段代码有问题,编译会通过,但运行会报出 IllegalMonitorStateException 。
因为 synchronized(Thread.currentThread()) 这里同步的是当前线程,
但在同步块中却用了obj变量的wait()方法。
由于同步的是当前线程,所以当前线程得到了线程监视器,但同步块中却让一个未指定监视器的对象进行等待。
将synchronized(Thread.currentThread()) 改为 synchronized(obj) 就能正常运行,但线程会一直等待。
可以查看一下帮助