1

假设我有 5 个线程属于一个名为“Fruits-group”的线程组。

如何一次性分配UncaughtExceptionHandler给所有线程Fruits-group

我知道我们可以UncaughtExceptionHandler为所有线程定义一个全局。我正在寻找的是将 a 分配UncaughtExceptionHandler给整个线程组?

4

1 回答 1

3

TL;DR子类化ThreadGroup并覆盖该uncaughtException()方法。

A一个,实现方法:ThreadGroup UncaughtExceptionHandleruncaughtException(Thread t, Throwable e)

当此线程组中的线程由于未捕获的异常而停止并且该线程没有安装特定的 Thread.UncaughtExceptionHandler 时,由 Java 虚拟机调用。

uncaughtException方法ThreadGroup执行以下操作:

  • 如果此线程组有一个父线程组,uncaughtException则使用相同的两个参数调用该父线程组的方法。
  • 否则,此方法检查是否安装了默认的未捕获异常处理程序,如果是,uncaughtException则使用相同的两个参数调用其方法。
  • 否则,此方法确定Throwable参数是否为ThreadDeath. 如果是这样,没有什么特别的。否则,一条包含线程名称的消息(从线程的getName方法返回)和使用Throwable'printStackTrace方法的堆栈回溯将打印到标准错误流。

应用程序可以在 的子类中重写此方法,ThreadGroup以提供对未捕获异常的替代处理。


更新

如果您希望能够为设置一个UncaughtExceptionHandlerThreadGroup您可以创建一个委托子类:

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实现。

于 2017-09-14T19:19:43.967 回答