Java多线程 需要UncaughtException的3个理由
发布日期:2021-06-30 13:12:03 浏览次数:2 分类:技术文章

本文共 1687 字,大约阅读时间需要 5 分钟。

文章目录

线程未捕获的异常UncaughtException应该如何处理

使用UncaughtExceptionHandler 的3个理由:

理由一: 主线程可以轻松的发现异常, 子线程却无法发现异常.

如下的代码演示了子线程发生了运行时异常, 但是主线程依然会继续运行的线程

/** * 类名称:ExceptionInChildThread * 类描述:  多线程,子线程发生异常. 主线程不会停止运行 * * @author: https://javaweixin6.blog.csdn.net/ * 创建时间:2020/8/30 18:38 * Version 1.0 */public class ExceptionInChildThread  implements Runnable{
public static void main(String[] args) {
//启动子线程 new Thread(new ExceptionInChildThread()).start(); //模拟主线程的逻辑处理 for (int i = 0; i < 1000; i++) {
System.out.println(i); } } @Override public void run() {
//模拟在子线程中发生运行时异常. throw new RuntimeException(); }}

通过控制台可以看到, 虽然打印出了子线程的异常, 但是主线程依然继续运行, 不受影响.

这样的后果是, 如果在生产环境中, 即使子线程发生了异常, 但是只是打印出了大量的异常信息, 那么查找异常信息时, 就会很困难.

理由二: 子线程的异常, 无法用传统的办法进行捕获

未使用try catch 时的代码如下. 子线程直接抛出一个运行时的异常

public class CantCatchDirectly implements Runnable{
public static void main(String[] args) throws InterruptedException {
new Thread(new CantCatchDirectly(),"MyThread-1").start(); Thread.sleep(300); new Thread(new CantCatchDirectly(),"MyThread-2").start(); Thread.sleep(300); new Thread(new CantCatchDirectly(),"MyThread-3").start(); Thread.sleep(300); new Thread(new CantCatchDirectly(),"MyThread-4").start(); } @Override public void run() {
throw new RuntimeException(); }}

控制台打印如下. 打印出了子线程的四个异常信息.

将上面的代码稍作修改, 使用try catch进行捕获
再次运行代码, 发现还是打印出了异常信息, 说明主线程并没有捕获到子线程的异常信息 .说明了子线程的异常, 无法用传统的办法进行捕获.
主要的原因是try catch的捕获异常, 是针对本线程的, 无法捕获子线程的异常.

理由三: 不能直接捕获的后果, 提高健壮性

如果不捕获异常, 后果就是子线程直接结束了运行, 可能造成数据的丢失等安全性问题. 捕获了子线程的异常, 提高程序的健壮性. 可以重启线程 , 系统报警等等.

转载地址:https://javaweixin6.blog.csdn.net/article/details/108309447 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:Java多线程 处理子线程异常的两种策略.(UncaughtExceptionHandler的介绍)
下一篇:Java多线程 线程属性面试问题

发表评论

最新留言

逛到本站,mark一下
[***.202.152.39]2024年04月25日 04时09分51秒

关于作者

    喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!

推荐文章