假设我有5个线程属于一个线程组,名为“”。
如何一次性将UncaughtExceptionHandler分配给Fruits-group的所有线程?
我知道我们可以为所有线程定义一个全局UncaughtExceptionHandler。我要找的是给整个线程组分配一个UncaughtExceptionHandler?
发布于 2017-09-14 19:19:43
TL;博士对ThreadGroup进行子类化,并重写uncaughtException()方法。
ThreadGroup是一个UncaughtExceptionHandler,实现了uncaughtException(Thread t, Throwable e)方法:
当这个线程组中的一个线程由于一个不明确的异常而停止时,当该线程没有安装特定的Thread.UncaughtExceptionHandler时,由Java调用。
uncaughtException方法ThreadGroup执行以下操作:
uncaughtException方法。uncaughtException方法。Throwable参数是否为ThreadDeath的实例。如果是这样的话,就不会做什么特别的事情。否则,从线程的getName方法返回的包含线程名称的消息和使用Throwable的printStackTrace方法返回的堆栈反向跟踪将被打印到标准错误流中。应用程序可以在的子类中覆盖此方法,以提供对未提及的异常的替代处理。
更新
如果您希望能够为该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实现。
https://stackoverflow.com/questions/46226650
复制相似问题