等等 - 通知工作?

时间:2012-11-15 13:40:49

标签: java multithreading

这是我编写的代码,用于测试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(), 由于它只打印“线程结束”,而不是循环?即使我是notify()来自主要还是没有......
  3. 现在,如果我在main中写notify(),它就无法完成执行。 在评论该行时,它完成执行并打印“End Of Main”。

1 个答案:

答案 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()调用会立即抛出异常。