JavaSE---多线程---线程组

雨燕双飞 提交于 2020-03-15 03:56:07

1、概述

      1.1  Java中  使用  ThreadGroup 表示  线程组,可以  对一批线程进行分类管理

      1.2  Java程序  可以  直接对  线程组 进行控制(相当于   同时控制这组线程);

      1.3  用户  创建的所有线程 都属于  指定线程组,如果程序没有显式指定 线程属于哪个线程组,则 该线程属于 默认线程组

            (默认情况下子线程与父线程  位于同一个线程组中  [A线程中创建了B线程])

      1.4  一旦线程加入某一组后,中途  将    不能改变它所属的组,直到死亡

      1.5  ThreadGroup 内定义了一个有用的方法,用来  处理  该线程组内 的线程 所抛出的 未处理的异常

      

public void uncaughtException(Thread t, Throwable e) {
        if (parent != null) {
            parent.uncaughtException(t, e);
        } else {
            Thread.UncaughtExceptionHandler ueh =
                Thread.getDefaultUncaughtExceptionHandler();
            if (ueh != null) {
                ueh.uncaughtException(t, e);
            } else if (!(e instanceof ThreadDeath)) {
                System.err.print("Exception in thread \""
                                 + t.getName() + "\" ");
                e.printStackTrace(System.err);
            }
        }
    }

      1.6  jdk5后,Java   加强了  线程的异常处理

            线程 执行过程中  遇到 一个  未处理的异常JVM 在结束该线程之前自动  查找 是否 有对应的Thread.UncaughtExceptionHandler对象。 

            如果找到 ,将会调用 该对象的uncaughtException()处理异常;

public class Thread{
  
   @FunctionalInterface
    public interface UncaughtExceptionHandler {
        /**
         * Method invoked when the given thread terminates due to the
         * given uncaught exception.
         * <p>Any exception thrown by this method will be ignored by the
         * Java Virtual Machine.
         * @param t the thread
         * @param e the exception
         */
        void uncaughtException(Thread t, Throwable e);
    }


   public void setUncaughtExceptionHandler(UncaughtExceptionHandler eh) {
        checkAccess();
        uncaughtExceptionHandler = eh;
    }


}

        setUncaughtExceptionHandler(UncaughtExceptionHandler eh)  为指定线程实例设置异常处理器

      1.7  ThreadGroup  实现了Thread.UncaughtExceptionHandler接口,每个线程  所属的线程组  将会作为  默认的异常处理器;

              当一个线程抛出未处理异常--->jvm查找该异常对应的异常处理器(setUncaughtExceptionHandler()设置的)--->找到,执行;

                                                              ---->未找到--->调用该线程所属线程组的uncaughtException();

                                                                      a,--->调用父线程组的uncaughtException()处理;

                                                                      b,--->该线程实例所属线程类的默认异常处理器;

                                                                      c,--->System.err输出 异常信息,结束线程;

    

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!