[英]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.