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