java 处理线程组中抛出的未捕获的异常

之前我学习了如何处理线程中抛出的未捕获的异常,这次范围扩大了,变成了线程组。

和线程中的未捕获异常处理有什么不同?是什么?为什么?怎么做?

 

一、是什么

线程组中抛出的未捕获的异常的处理,和线程中抛出的未捕获的异常的处理,目的是一致的,但是实现过程是不同的。

同时,这两种处理可以共存,有一定的优先顺序,接下来会实验。

二、为什么

和线程中抛出的未捕获的异常的处理的原因是一致的。所以还是把侧重点放在怎么实现上。

三、怎么做

1.线程组内处理未捕获的错误

需要先写一个自己的线程组类,继承ThreadGroup类:

实现ThreadGroup方法必须重写一个带参数的构造方法:

然后实现uncaughtException方法:

再把线程加入这个自定义的线程组中:

加入到线程组后,所有组内的线程都会接受uncaughtException方法的错误处理。

这里就和线程中未捕获错误的处理方法不一样了。一个是写一个线程错误处理类,实现UncaughtExceptionHandler接口。一个是重写一个线程组类,继承ThreadGroup类。

输出结果:

可以看见自定义的线程组类中实现的uncaughtException方法正确捕获了错误。

2.优先级

线程组未捕获错误处理和线程未捕获错误处理可以同时存在,并且存在优先级。如果两者同时存在:

结果为:

可以看见是线程中未捕获错误处理类先行处理了错误。所以在优先级上线程未捕获错误处理>线程组未捕获错误处理。

但是优先级最高的始终是线程内自己捕获的错误处理。

四、总结

从未捕获错误处理方式来看,线程组确实存在优点(可以统一管理),而线程未捕获错误处理方式就比较麻烦(需要各条线程逐一设置)。

发表评论

电子邮件地址不会被公开。 必填项已用*标注