0

这是我编写的代码,用于测试wait()and的工作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()在线程中,因为它只打印“线程结束”,而不是循环?即使我notify()来自主要与否...
  3. 现在,如果我在 main 中写入notify(),它不会完成执行。在评论该行时,它完成执行并打印“End Of Main”。
4

1 回答 1

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() ,因此它只打印“线程结束”,而不是循环?即使我从 main 通知()...

同样的事情在这里发生,但在不同的线程中。您创建的新线程不拥有 t 上的锁,因此wait()调用会引发异常。同样,您正在丢弃异常,因为没有正确处理它。

现在,如果我在 main 中编写 notify() ,它不会完成执行。在评论该行时,它完成执行并打印“End Of Main”。

我假设您的意思是“注释掉对 wait() 和 notify() 的调用”。这是意料之中的。run() 方法已完成,即:它捕获了抛出的 IllegalMonitorStateException 并继续到方法的末尾。当线程完成执行时,join() 方法返回。这几乎立即发生,因为 wait() 调用立即引发异常。

于 2012-11-15T14:08:23.037 回答