出于某种原因,我对以下内容感到困惑:
假设我有 Thread A
绝对 需要在 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
}
}
我的问题如下:在这种情况下,处理异常的正确方法是什么?
在我见过的各种例子中,甚至在教科书中,异常都被忽略了。
因此,如果 Thread A
需要确保 Thread B
在继续之前完全完成,如果我由于异常而结束在 catch 中,是否可以这样 Thread B
可能实际上仍可运行/正在运行?那么处理这个异常的最佳方式是什么?
最佳答案
首先你必须明白是什么原因导致抛出这个异常。在线程上调用 stop()
目前已被弃用,相反,当您想停止线程时,您可以通过调用 thread.interrupt()
来中断它>。这对线程没有影响 (!),线程必须偶尔显式检查 interrupted
标志并正常停止处理。
但是,如果线程 hibernate 、等待锁或另一个线程(通过使用 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 试图说的是:“危险!危险!停止等待你正在等待的任何东西并运行!”。
关于java - 加入线程时处理异常的最佳方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11565720/