决定开始持续更新这个专栏的目的,就是为了记录学习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,没想的可以这样用。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。