携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第29天,点击查看活动详情
今天,我们来解析一下线程异常管理器的源码,看看是如何实现的。
jni层面的源码解析
我们想线程遇到异常,一定会退出,退出就会执行退出方法,
它会回调一个java层面的dispatchUncaughtException方法
Java层面的源码解析
这个方法是虚拟机调用的方法
我们来打个断点看一下:
然后往下走,这个方法看看你的这个UncaughtExceptionHandler是不是空,很明显不是。
不是的话,就调用到我们设置的这个方法,打印结束,之后执行钩子函数,然后销毁虚拟机。
如果这个UncaughtExceptionHandler是空呢?看看会发生什么?如果是空的话,那就会把这个线程组给过去。
这里为啥能返回一个线程组呢?因为这个线程组是这个接口的实现:
然后调用到线程组里的这个uncaughtException方法,这里有个判断,判断父线程组是不是空,很明显是空。
是空,就打印出这个信息:
这里也是空,因为我们没有设置
然后就走到这个方法,打印异常信息,接着销毁虚拟机
总结
他这个uncaughtException方法,优先级最高的是这个父线程组里的方法,然后是子线程自己的方法,最后是虚拟机自己打印的方法。