java - 加入线程时处理异常的最佳方法

标签 java multithreading exception-handling concurrency

出于某种原因,我对以下内容感到困惑:
假设我有 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/

相关文章:

c# - ASP.NET/C# 事件差异

java - 按严格顺序打印线程

objective-c - NSLocking 的使用是否应该始终包含在@try/@finally 中?

java - 在java中,如果try和catch都抛出相同的异常并最终返回怎么办?

java - 在我的桌面应用程序中使用第三方 jar

java - PyYaml 到 SnakeYaml --- AWT-EventQueue- 0"Can' t 为标签 :yaml. org,2002:java/object 构造一个 java 对象:

java - 生成 BKS keystore 并存储应用程序 key

java - Java 中的并行读写

wpf - UnhandledException 未被处理的可能原因是什么?

java - 如何使用 CFB 模式、256 位 block 大小和 BouncycaSTLe 加密 Rijndael?