欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

了解一下ThreadGroup的uncaughtException方法

程序员文章站 2022-05-14 20:45:28
为什么会想要了解ThreadGroup的uncaughtException方法?起源于Thread类中的UncaughtExceptionHandler接口,详情如下:可以发现UncaughtExceptionHandler是个函数式接口。那么找找UncaughtExceptionHandler接口和Thread类到底有什么关系?会看到如下方法当线程在运行过程中出现异常时, 就会回调UncaughtExceptionHandler接口,然后就可以知道是哪个线程出了错,该方法就是获取相关U....

为什么会想要了解ThreadGroup的uncaughtException方法?

起源于Thread类中的UncaughtExceptionHandler接口,详情如下:
了解一下ThreadGroup的uncaughtException方法

可以发现UncaughtExceptionHandler是个函数式接口。

那么找找UncaughtExceptionHandler接口和Thread类到底有什么关系?会看到如下方法

了解一下ThreadGroup的uncaughtException方法

当线程在运行过程中出现异常时, 就会回调UncaughtExceptionHandler接口,然后就可以知道是哪个线程出了错,该方法就是获取相关UncaughtExceptionHandler接口的方法。同时截图中代码的逻辑表示,如果该线程的UncaughtExceptionHandler为null,那么就会去获取该线程所在线程组的UncaughtExceptionHandler接口。

那为什么该方法明明要返回UncaughtExceptionHandler接口类,却可以返回group,原因如下

了解一下ThreadGroup的uncaughtException方法
了解一下ThreadGroup的uncaughtException方法

可以发现group对象是ThreadGroup类的实例,同时是UncaughtExceptionHandler接口的子类,所以能够返回group。

那么作为UncaughtExceptionHandler接口的子类,必然要实现UncaughtExceptionHandler接口中的抽象方法,所以接着看看uncaughtException方法在ThreadGroup类的实现

ThreadGroup的uncaughtException方法源码如下:

private final ThreadGroup parent;

public class ThreadDeath extends Error {
    private static final long serialVersionUID = -4417128565033088268L;
}
public void uncaughtException(Thread t, Throwable e) {
    //如果父级线程组不为null,那么就使用父级线程组的uncaughtException
    if (parent != null) {
        parent.uncaughtException(t, e);
    } else {
        //否则获取全局默认的UncaughtExceptionHandler 
        Thread.UncaughtExceptionHandler ueh =
            Thread.getDefaultUncaughtExceptionHandler();
        if (ueh != null) {
            //不为null,则使用全局默认的UncaughtExceptionHandler的uncaughtException方法
            ueh.uncaughtException(t, e);
        } else if (!(e instanceof ThreadDeath)) {
            //如果以上两者都不满足,则将异常的堆栈信息定向到System.err
            System.err.print("Exception in thread \""
                             + t.getName() + "\" ");
            e.printStackTrace(System.err);
        }
    }
}

本文地址:https://blog.csdn.net/weixin_38106322/article/details/107397095

相关标签: Java并发编程