共计 1038 个字符,预计需要花费 3 分钟才能阅读完成。
决定开始持续更新这个专栏的目的,就是为了记录学习 Java 过程中各种不懂,或者让我抓狂的东西,搞懂解决之后记录下来,方便自己也方便别人。以前学 Java 总是不得要领,要说不会吧,基本语法都会;要说会吧,真的是 Java 的基础库都没搞懂几个,更不要说并发,锁,Collection 集合类等内容了。
最近在看 Spring Boot 的源码,看成熟项目的源码就是能让你开拓很多的眼界,时不时就能让人发出:“原来还能这样做呀!”
Spring Boot 的 Maven 插件这里实现了一个 ThreadGroup, 用来捕捉那些没有 handler 的线程的异常
class IsolatedThreadGroup extends ThreadGroup {private final Object monitor = new Object();
private Throwable exception;
IsolatedThreadGroup(String name) {super(name);
}
@Override
public void uncaughtException(Thread thread, Throwable ex) {if (!(ex instanceof ThreadDeath)) {
// 这里加锁的意义,看起来就是要用 this.exception 记住第一个发生的异常,其他的只是输出
synchronized (this.monitor) {this.exception = (this.exception != null) ? this.exception : ex;
}
getLog().warn(ex);
}
}
void rethrowUncaughtException() throws MojoExecutionException {
// 这里为什么要加锁呢
// 感觉这里加锁的原因只是确保执行的时候 this.exception 不变,如果是 null 就是 null,即使刚好有个线程发生了异常
synchronized (this.monitor) {if (this.exception != null) {
throw new MojoExecutionException("An exception occurred while running." + this.exception.getMessage(), this.exception);
}
}
}
}
看了下文档,原来可以重写 uncaughtException 来捕捉那些未被处理的线程异常,之前一直没有好好搞清楚过 ThreadGroup,没想的可以这样用。
正文完