0

我正在开发一个 Android 应用程序。

我有两个线程。第一个必须等​​待第二个。

我在第一个线程 run方法上有这段代码:

@Override
public void run() {

  synchronized (this.secondThread) {
      this.secondThread.wait();
  }

   [...]
}

在我的第二个线程上:

@Override
public void run() {

    synchronized (MyClass.myLock) {

        try {

            // Do something important here

        }
        catch (Exception ex)
        {
            // manage exception
            return;
        }
        finally {
            // do something...
        }
    }

    synchronized (this) {
        this.notify();
    }

    [...]

}

如您所见,catch 块内有一个返回。

使用此代码,如果第二个线程发生异常,第一个线程会得到通知吗?

4

4 回答 4

2

如果第二个线程发生异常,第一个线程会得到通知吗?

答案是否定的。除非您在返回前明确地 notify()在 catch 块中,否则其他线程不会唤醒

于 2013-05-10T12:23:20.367 回答
0

答案是否定的。为了得到两个通知,必须synchronized在同一个对象上。this可以不同。如果您希望通知所有等待对象的线程,您可以调用notifyAll()而不是notify(). )notifyAll(应该放在finally块内。事实上,尽管返回,finally 块总是被执行

于 2013-05-10T12:32:14.537 回答
0

如果您希望它无条件地工作,notify()应该在 finally 块内,但您应该真正使用Thread.join()而不是wait(): 那么正在等待的线程根本不需要做任何事情。

于 2013-05-10T12:32:31.983 回答
0

答案是否定的。除非您在返回之前在 catch 块中显式 notify(),否则其他线程不会唤醒,您必须处理所有可能的异常,并且在每种情况下都通知您的第一个线程,确保您的第一个线程输入不依赖于第二个线程输出否则你可能会在线程 1 中解决一些其他问题。

于 2013-05-10T13:02:13.230 回答