我正在开发一款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区块内有一个返回。
使用此代码,如果第二个线程发生异常,将首先通知线程吗?
答案 0 :(得分:2)
如果在第二个上发生异常,将首先通知线程 线程?
答案是否定的。除非你在返回之前在catch块中明确地 notify()
,否则另一个线程不会被唤醒
答案 1 :(得分:0)
答案是否定的。为了获得两者,必须在同一个对象上通知synchronized
。 this
可能不同。如果您希望等待对象的所有线程通知您,请致电notifyAll()
而不是notify()
。 notifyAll(
)应放在finally
块内。事实上,尽管返回了finally块,但总是被执行
答案 2 :(得分:0)
如果你想让它无条件地工作,那么notify()
应该在finally块内,但是你应该真的使用Thread.join()
而不是wait()
:那么正在等待的线程就没有了什么都不做。
答案 3 :(得分:0)
答案是否定的。除非你在返回之前在catch块中显式地通知(),否则另一个线程将不会被唤醒,你必须有Al可能的异常,并且在每种情况下都通知你的第一个线程,确保你的第一个线程输入不依赖于第二个线程输出否则你可能会在线程1中解决其他一些问题。