用ThreadGroup来捕捉线程未捕捉的异常

37次阅读

共计 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,没想的可以这样用。

正文完
 0