这是我编写的代码,用于测试wait()
和notify()
的工作情况。
现在我有一堆疑惑。
class A extends Thread {
public void run() {
try {
wait();
for (int i = 1; i <= 5; i++) {
System.out.println(i);
sleep(500);
}
} catch (Exception e) {
}
System.out.println("End Of Thread");
}
}
class ThreadWaitNotify {
public static void main(String args[]) {
try {
A t = new A();
t.start();
t.wait();
t.notify();
t.join();
System.out.println("End Of Main");
} catch (Exception e) {
}
}
}
我的问题是:
t.wait()
时,main不再执行,
我无法进一步恢复。怎么做?wait()
,
由于它只打印“线程结束”,而不是循环?即使我是notify()
来自主要还是没有...... notify()
,它就无法完成执行。
在评论该行时,它完成执行并打印“End Of Main”。答案 0 :(得分:2)
我的问题是:
当我在main中写入t.wait()时,main不再执行,我无法继续进行。怎么做?
正在运行main的线程在调用t
时不会锁定t.wait()
。正如您将从JavaDoc中看到的wait():
引发:IllegalMonitorStateException - 如果当前线程不是对象监视器的所有者。
因此,对wait()的调用导致抛出IllegalMonitorStateException。空的catch块只是丢弃错误,这使得调试变得困难。
您可以使用ex.printStackTrace()
显示错误;或者您可以将其作为未经检查的例外重新抛出:
throw new RuntimeException(ex);
要修复wait()调用,您需要在t:
上进行同步synchronized (t) {
t.wait();
}
调用notify()时,您还需要保持相同的锁定。
其次我也在线程中编写了wait(),因为它只打印“End Of Thread”,而不是循环?即使我从主要通知()或不通过...
同样的事情发生在这里,但是在另一个线程中。您创建的新线程不拥有t上的锁,因此wait()
调用会抛出异常。同样,你正在丢弃异常,因为没有正确处理它。
现在,如果我在main中写入notify(),它就不会完成执行。在评论该行时,它完成执行并打印“End Of Main”。
我认为你的意思是“注释掉wait()和notify()的调用”。这是预料之中的。 run()方法已经完成,即:它捕获了抛出的IllegalMonitorStateException并将其继续到方法的末尾。当线程完成执行时,join()方法返回。这几乎立即发生,因为wait()调用会立即抛出异常。