决定开始持续更新这个专栏的目的,就是为了记录学习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,没想的可以这样用。