簡體   English   中英

等等 - 通知工作?

[英]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) {
    }
  }
}

我的問題是:

  1. 當我在main中寫入t.wait()時,main不會進一步執行,我無法繼續進行。 怎么做?
  2. 其次我也在線程中寫了wait() ,因為它只打印“End Of Thread”,而不是循環? 即使我從主要或不notify() ...
  3. 現在,如果我在main中編寫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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM