如何为线程组设置 UncaughtExceptionHandler
How to set UncaughtExceptionHandler for a thread group
假设我有 5 个线程属于名为 "Fruits-group" 的线程组。
如何一次性将UncaughtExceptionHandler
分配给Fruits-group
的所有线程?
我知道我们可以为所有线程定义一个全局 UncaughtExceptionHandler
。
我正在寻找的是将 UncaughtExceptionHandler
分配给整个线程组?
TL;DR 继承 ThreadGroup
并重写 uncaughtException()
方法。
一个ThreadGroup
is an UncaughtExceptionHandler
, implementing the uncaughtException(Thread t, Throwable e)
方法:
Called by the Java Virtual Machine when a thread in this thread group stops because of an uncaught exception, and the thread does not have a specific Thread.UncaughtExceptionHandler installed.
The uncaughtException
method of ThreadGroup
does the following:
- If this thread group has a parent thread group, the
uncaughtException
method of that parent is called with the same two arguments.
- Otherwise, this method checks to see if there is a default uncaught exception handler installed, and if so, its
uncaughtException
method is called with the same two arguments.
- Otherwise, this method determines if the
Throwable
argument is an instance of ThreadDeath
. If so, nothing special is done. Otherwise, a message containing the thread's name, as returned from the thread's getName
method, and a stack backtrace, using the Throwable
's printStackTrace
method, is printed to the standard error stream.
Applications can override this method in subclasses of ThreadGroup
to provide alternative handling of uncaught exceptions.
更新
如果您希望能够为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
实施。
假设我有 5 个线程属于名为 "Fruits-group" 的线程组。
如何一次性将UncaughtExceptionHandler
分配给Fruits-group
的所有线程?
我知道我们可以为所有线程定义一个全局 UncaughtExceptionHandler
。
我正在寻找的是将 UncaughtExceptionHandler
分配给整个线程组?
TL;DR 继承 ThreadGroup
并重写 uncaughtException()
方法。
一个ThreadGroup
is an UncaughtExceptionHandler
, implementing the uncaughtException(Thread t, Throwable e)
方法:
Called by the Java Virtual Machine when a thread in this thread group stops because of an uncaught exception, and the thread does not have a specific Thread.UncaughtExceptionHandler installed.
The
uncaughtException
method ofThreadGroup
does the following:
- If this thread group has a parent thread group, the
uncaughtException
method of that parent is called with the same two arguments.- Otherwise, this method checks to see if there is a default uncaught exception handler installed, and if so, its
uncaughtException
method is called with the same two arguments.- Otherwise, this method determines if the
Throwable
argument is an instance ofThreadDeath
. If so, nothing special is done. Otherwise, a message containing the thread's name, as returned from the thread'sgetName
method, and a stack backtrace, using theThrowable
'sprintStackTrace
method, is printed to the standard error stream.Applications can override this method in subclasses of
ThreadGroup
to provide alternative handling of uncaught exceptions.
更新
如果您希望能够为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
实施。