线程在完成执行时是否通知另一个连接的线程



我正在开发一个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块中有一个返回值

使用这段代码,如果第二个线程发生异常,是否会通知第一个线程?
如果第二个线程发生异常,第一个线程将得到通知的线程吗?

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

答案是否定的。为了获得两个通知,必须在同一对象上设置synchronizedthis可以不同。如果你想通知所有等待对象的线程,你必须调用notifyAll()而不是notify()notifyAll()应该放在finally块中。事实上,尽管有返回,finally块总是被执行

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

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

最新更新