出于某种原因,我对以下内容感到困惑:
假设我有Thread A
that 绝对地需要执行后Thread B
已完成其处理。
做到这一点的一种方法是Thread A
加盟Thread B
.
简单的例子:
public class MainThread {
public static void main(String[] args){
Thread b = new Thread (new SomeRunnable(args[0]));
b.start();
try {
b.join();
} catch(InteruptedException e) {
}
// Go on with processing
}
}
我的问题如下:在这种情况下处理异常的正确方法是什么?
在我见过的各种例子中,即使在教科书中,异常也被忽略。
So if Thread A
需要确定Thread B
在继续之前已经完全完成了,如果我由于异常而最终陷入困境,可能是这样的情况Thread B
实际上仍然可以运行/正在运行吗?那么处理这个异常的最佳方法是什么?
首先,您必须了解导致抛出此异常的原因。呼唤stop()
目前已弃用在线程上,相反,当您想停止线程时,您可以打断通过调用它thread.interrupt()
。这对线程没有影响(!),线程必须显式检查interrupted
偶尔标记一次并优雅地停止处理。
但是,如果线程休眠,则等待锁或另一个线程(通过使用join()
就像您的示例中一样)它无法立即或足够频繁地检查此标志。在这些情况下,JVM 会从阻塞方法中抛出异常(让它成为join()
)向您的线程发出信号,表明有人刚刚尝试中断它。通常,您可以忽略该异常(意思是 - 不记录它) - 这是重要的副作用。例如跳出循环:
public void run() {
try {
while(!isInterrupted()) {
Thread.sleep(1000);
//...
} catch(InterruptedException e) {
//no need to log it, although it's a good idea.
}
}
您没有记录该异常并不是问题 - 但您逃离了循环,有效地终止了线程。
现在回到你的问题。当你的Thread A
被中断意味着其他线程请求终止它,可能是因为整个 JVM 关闭或 Web 应用程序正在取消部署。在这种情况下,除了清理之外,您不应该做任何事情。
此外,这很可能意味着Thread B
仍在运行。但 JVM 想说的是:“危险!危险!停止等待,奔跑吧!".
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)