[英]Wait - Notify working?
这是我编写的代码,用于测试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()
,因为它只打印“End Of Thread”,而不是循环? 即使我从主要或不notify()
... notify()
,它就不会完成执行。 在评论该行时,它完成执行并打印“End Of Main”。 我的问题是:
当我在main中写入t.wait()时,main不再执行,我无法继续进行。 怎么做?
正在运行main的线程在调用t.wait()
时不会锁定t
。 正如您将从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()调用立即抛出异常。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.