假设我有5个线程属于一个名为" Fruits-group"的线程组。
如何一次性将UncaughtExceptionHandler
分配给Fruits-group
的所有主题?
我知道我们可以为所有线程定义全局UncaughtExceptionHandler
。
我要找的是为整个线程组分配UncaughtExceptionHandler
?
答案 0 :(得分:2)
TL; DR 对ThreadGroup
进行子类化并覆盖uncaughtException()
方法。
ThreadGroup
UncaughtExceptionHandler
,实施uncaughtException(Thread t, Throwable e)
方法:
当此线程组中的线程因未捕获的异常而停止时,由Java虚拟机调用,并且该线程没有安装特定的Thread.UncaughtExceptionHandler。
uncaughtException
的{{1}}方法执行以下操作:
- 如果此线程组具有父线程组,则使用相同的两个参数调用该父线程的
ThreadGroup
方法。- 否则,此方法检查是否安装了默认的未捕获异常处理程序,如果是,则使用相同的两个参数调用其
uncaughtException
方法。- 否则,此方法确定
uncaughtException
参数是否为Throwable
的实例。如果是这样,没有什么特别的。否则,将使用ThreadDeath
的{{1}}方法将包含线程名称(从线程的getName
方法返回)和堆栈回溯的消息打印到标准错误流。应用程序可以在
Throwable
的子类中覆盖此方法,以提供对未捕获异常的替代处理。
<强>更新强>
如果您希望能够为printStackTrace
设置 ThreadGroup
,则可以创建委派子类:
UncaughtExceptionHandler
但是,一般情况下,直接在子类中实现异常处理逻辑可能会更好,但这样,您可以使用现有的ThreadGroup
实现。