我正在开发一个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块中,否则其他线程将不会唤醒
答案是否定的。为了获得两个通知,必须在同一对象上设置synchronized
。this
可以不同。如果你想通知所有等待对象的线程,你必须调用notifyAll()
而不是notify()
。notifyAll(
)应该放在finally
块中。事实上,尽管有返回,finally块总是被执行
如果你想让它无条件地工作,notify()
应该在finally块内,但是你应该真正使用Thread.join()
而不是wait()
:那么正在等待的线程根本不需要做任何事情。
答案是否定的。除非你在返回之前显式地在catch块中notify(),否则其他线程不会唤醒,你必须考虑可能的异常,并在每种情况下通知你的第一个线程,确保你的第一个线程输入不依赖于第二个线程输出,否则你可能会在线程1中遇到一些其他问题。