子线程异常处理
该文章参考自:https://blog.csdn.net/qq_38962004/article/details/79908245
在普通的单线程程序中,捕获异常只需要通过try ... catch ... finally ...代码块就可以了。那么,在并发情况下,比如在父线程中启动了子线程,如何正确捕获子线程中的异常,从而进行相应的处理呢?
常见错误
也许有人会觉得,很简单嘛,直接在父线程启动子线程的地方try ... catch一把就可以了,其实这是不对的。
让我们回忆一下Runnable接口的run方法的完整签名,因为没有标识throws语句,所以方法是不会抛出checked异常的。至于RuntimeException这样的unchecked异常,由于新线程由JVM进行调度执行,如果发生了异常,也不会通知到父线程。
解决方式:
这里有三种解决办法,前两种都是在子线程中处理,第三种是通过在父线程中处理。具体哪种方案取决于使用场景。
方法一:子线程中try catch处理

方法二:为线程设置“未捕获异常处理器”UncaughtExceptionHandler


方法三:通过Future的get方法捕获异常

 
主线程代码:

考虑之前异常导出文章中的一个不足点,可考虑第二种方式,业务代码中多加一行固定的设置当前线程的异常处理,其他封装到工具类中处理,相比第一种方式要简单一些,业务方使用起来也较为接受。

                
            
        
浙公网安备 33010602011771号