线程异常管理器源码解析

96 阅读1分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第29天,点击查看活动详情

今天,我们来解析一下线程异常管理器的源码,看看是如何实现的。

jni层面的源码解析

我们想线程遇到异常,一定会退出,退出就会执行退出方法,

image.png

它会回调一个java层面的dispatchUncaughtException方法

image.png

Java层面的源码解析

这个方法是虚拟机调用的方法 image.png

我们来打个断点看一下:

image.png

然后往下走,这个方法看看你的这个UncaughtExceptionHandler是不是空,很明显不是。

image.png

不是的话,就调用到我们设置的这个方法,打印结束,之后执行钩子函数,然后销毁虚拟机。

image.png

如果这个UncaughtExceptionHandler是空呢?看看会发生什么?如果是空的话,那就会把这个线程组给过去。

image.png

这里为啥能返回一个线程组呢?因为这个线程组是这个接口的实现:

image.png

然后调用到线程组里的这个uncaughtException方法,这里有个判断,判断父线程组是不是空,很明显是空。

image.png

是空,就打印出这个信息:

image.png

这里也是空,因为我们没有设置 image.png

然后就走到这个方法,打印异常信息,接着销毁虚拟机 image.png

总结

他这个uncaughtException方法,优先级最高的是这个父线程组里的方法,然后是子线程自己的方法,最后是虚拟机自己打印的方法。