假设我有 5 个线程属于一个名为“Fruits-group”的线程组。
如何一次性分配UncaughtExceptionHandler
给所有线程Fruits-group
?
我知道我们可以UncaughtExceptionHandler
为所有线程定义一个全局。我正在寻找的是将 a 分配UncaughtExceptionHandler
给整个线程组?
假设我有 5 个线程属于一个名为“Fruits-group”的线程组。
如何一次性分配UncaughtExceptionHandler
给所有线程Fruits-group
?
我知道我们可以UncaughtExceptionHandler
为所有线程定义一个全局。我正在寻找的是将 a 分配UncaughtExceptionHandler
给整个线程组?
TL;DR子类化ThreadGroup
并覆盖该uncaughtException()
方法。
A是一个,实现方法:ThreadGroup
UncaughtExceptionHandler
uncaughtException(Thread t, Throwable e)
当此线程组中的线程由于未捕获的异常而停止并且该线程没有安装特定的 Thread.UncaughtExceptionHandler 时,由 Java 虚拟机调用。
的
uncaughtException
方法ThreadGroup
执行以下操作:
- 如果此线程组有一个父线程组,
uncaughtException
则使用相同的两个参数调用该父线程组的方法。- 否则,此方法检查是否安装了默认的未捕获异常处理程序,如果是,
uncaughtException
则使用相同的两个参数调用其方法。- 否则,此方法确定
Throwable
参数是否为ThreadDeath
. 如果是这样,没有什么特别的。否则,一条包含线程名称的消息(从线程的getName
方法返回)和使用Throwable
'printStackTrace
方法的堆栈回溯将打印到标准错误流。应用程序可以在 的子类中重写此方法,
ThreadGroup
以提供对未捕获异常的替代处理。
更新
如果您希望能够为设置一个UncaughtExceptionHandler
,ThreadGroup
您可以创建一个委托子类:
public class ExceptionHandlingThreadGroup extends ThreadGroup {
private UncaughtExceptionHandler uncaughtExceptionHandler;
public ExceptionHandlingThreadGroup(String name) {
super(name);
}
public ExceptionHandlingThreadGroup(ThreadGroup parent, String name) {
super(parent, name);
}
public UncaughtExceptionHandler getUncaughtExceptionHandler() {
return this.uncaughtExceptionHandler;
}
public void setUncaughtExceptionHandler(UncaughtExceptionHandler uncaughtExceptionHandler) {
this.uncaughtExceptionHandler = uncaughtExceptionHandler;
}
@Override
public void uncaughtException(Thread t, Throwable e) {
if (this.uncaughtExceptionHandler != null)
this.uncaughtExceptionHandler.uncaughtException(t, e);
else
super.uncaughtException(t, e);
}
}
不过,一般来说,直接在子类中实现异常处理逻辑可能会更好,但是这样,您可以使用现有的UncaughtExceptionHandler
实现。