Java 如何为线程组设置UncaughtExceptionHandler

Java 如何为线程组设置UncaughtExceptionHandler,java,multithreading,threadgroup,Java,Multithreading,Threadgroup,假设我有5个线程属于一个名为“水果组”的线程组 如何一次性将UncaughtExceptionHandler分配给Fruits组的所有线程 我知道我们可以为所有线程定义一个全局UncaughtExceptionHandler。 我要找的是为整个线程组分配一个UncaughtExceptionHandler;DR对线程组进行子类化,并重写uncaughtException()方法 A是一个,实现该方法: 当此线程组中的某个线程由于未捕获异常而停止,并且该线程未安装特定的thread.Uncaugh

假设我有5个线程属于一个名为“水果组”的线程组

如何一次性将
UncaughtExceptionHandler
分配给
Fruits组的所有线程

我知道我们可以为所有线程定义一个全局
UncaughtExceptionHandler

我要找的是为整个线程组分配一个
UncaughtExceptionHandler
;DR对
线程组
进行子类化,并重写
uncaughtException()
方法

A是一个,实现该方法:

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

ThreadGroup
uncaughtException
方法执行以下操作:

  • 如果此线程组具有父线程组,则使用相同的两个参数调用该父线程组的
    uncaughtException
    方法
  • 否则,此方法将检查是否安装了默认的未捕获异常处理程序,如果是,则使用相同的两个参数调用其
    uncaughtException
    方法
  • 否则,此方法将确定
    Throwable
    参数是否是
    ThreadDeath
    的实例。如果是这样的话,就没有什么特别的措施了。否则,包含线程名称的消息(从线程的
    getName
    方法返回)和堆栈回溯(使用
    Throwable
    printStackTrace
    方法)将打印到标准错误流中
应用程序可以在
ThreadGroup
的子类中重写此方法,以提供未捕获异常的替代处理。


更新

如果希望能够为
ThreadGroup
设置
UncaughtExceptionHandler
,可以创建委派子类:

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

public void uncaughtException(线程t,Throwable e)
。我知道我们必须在第二个参数中传递UncaughtExceptionHandler的实例,但是在第一个参数中应该传递哪个线程实例:
any,或者当前线程
@PrakashPandey,这是什么意思?在
ThreadGroup
的子类中实现
uncaughtException()
方法,JVM将调用它。你不叫它。如果希望子类获取一个
UncaughtExceptionHandler
并将其存储在子类的字段中,然后将子类
uncaughtException()
实现中的调用转发到给定的
UncaughtExceptionHandler
,则需要传递两个参数值。