<导航

子线程异常处理

该文章参考自: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方法捕获异常

 

主线程代码:


 

 

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

 

posted @ 2022-02-22 15:48  字节悦动  阅读(184)  评论(0)    收藏  举报