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

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

你可能感兴趣的