1、概述
1.1 Java中 使用 ThreadGroup 表示 线程组,可以 对一批线程进行分类管理;
1.2 Java程序 可以 直接对 线程组 进行控制(相当于 同时控制这组线程);
1.3 用户 创建的所有线程 都属于 指定线程组,如果程序没有显式指定 线程属于哪个线程组,则 该线程属于 默认线程组;
(默认情况下,子线程与父线程 位于同一个线程组中 [A线程中创建了B线程])
1.4 一旦线程加入某一组后,中途 将 不能改变它所属的组,直到死亡;
1.5 ThreadGroup 内定义了一个有用的方法,用来 处理 该线程组内 的线程 所抛出的 未处理的异常:
public void uncaughtException(Thread t, Throwable e) {
if (parent != null) {
parent.uncaughtException(t, e);
} else {
Thread.UncaughtExceptionHandler ueh =
Thread.getDefaultUncaughtExceptionHandler();
if (ueh != null) {
ueh.uncaughtException(t, e);
} else if (!(e instanceof ThreadDeath)) {
System.err.print("Exception in thread \""
+ t.getName() + "\" ");
e.printStackTrace(System.err);
}
}
}
1.6 jdk5后,Java 加强了 线程的异常处理:
线程 执行过程中 遇到 一个 未处理的异常,JVM 在结束该线程之前 会 自动 查找 是否 有对应的Thread.UncaughtExceptionHandler对象。
如果找到 ,将会调用 该对象的uncaughtException()处理异常;
public class Thread{
@FunctionalInterface
public interface UncaughtExceptionHandler {
/**
* Method invoked when the given thread terminates due to the
* given uncaught exception.
* <p>Any exception thrown by this method will be ignored by the
* Java Virtual Machine.
* @param t the thread
* @param e the exception
*/
void uncaughtException(Thread t, Throwable e);
}
public void setUncaughtExceptionHandler(UncaughtExceptionHandler eh) {
checkAccess();
uncaughtExceptionHandler = eh;
}
}
setUncaughtExceptionHandler(UncaughtExceptionHandler eh) 为指定线程实例设置异常处理器
1.7 ThreadGroup 实现了Thread.UncaughtExceptionHandler接口,每个线程 所属的线程组 将会作为 默认的异常处理器;
当一个线程抛出未处理异常--->jvm查找该异常对应的异常处理器(setUncaughtExceptionHandler()设置的)--->找到,执行;
---->未找到--->调用该线程所属线程组的uncaughtException();
a,--->调用父线程组的uncaughtException()处理;
b,--->该线程实例所属线程类的默认异常处理器;
c,--->System.err输出 异常信息,结束线程;
来源:https://www.cnblogs.com/anpeiyong/p/11023283.html