ThreadGroup 详细讲解

    xiaoxiao2024-10-29  95

    ThreadGroup 详细讲解

    在初识线程文章中,我们多次提到 ThreadGroup 的概念,在创建线程的时候如果没有显示指定 ThreadGroup , 那么新的线程会加入与父线程相同的 ThreadGroup 中,在本文中,将详细讲解有关 ThreadGroup 的知识

    1. ThreadGroup 与 Thread

    在Java程序中,默认情况下,新的线程都会加入到 main 线程所在的 group 中, main 线程的 group 和线程同名。和线程存在父子关系一样, ThreadGroup 也存在父子关系

    无论如何,线程都会加入某个ThreadGroup 之中

    2. 创建 ThreadGroup

    public ThreadGroup(String name) public ThreadGroup(ThreadGroup parent, String name)

    第一个构造函数为 ThreadGroup 赋予名字,但是该 ThreadGroup 的父 ThreadGroup 是创建它线程所在的 ThreadGroup,第二个构造函数可以显示指定父 ThreadGroup

    3. ThreadGroup 操作

    active() 用于获取 group 中活跃的线程activeGroupCount() 用去 group 中活跃的子 groupgetMaxPriority() 获取 group 的优先级,默认为10getName() 获取 group 的名字getParent() 获取 group 的父 group 不存在返回 null

    interrupt

    该方法会导致该 group 中所有的 active 线程被 interrupt, 也就是该 group 中每一个线程的 interrupt 都被标识

    public final void interrupt() { int ngroupsSnapshot; ThreadGroup[] groupsSnapshot; synchronized (this) { checkAccess(); for (int i = 0 ; i < nthreads ; i++) { threads[i].interrupt(); } ngroupsSnapshot = ngroups; if (groups != null) { groupsSnapshot = Arrays.copyOf(groups, ngroupsSnapshot); } else { groupsSnapshot = null; } } for (int i = 0 ; i < ngroupsSnapshot ; i++) { groupsSnapshot[i].interrupt(); } }

    该方法会执行所有 thread 的 interrupt 方法,并且递归获取子 group, 然后执行各自的 interrupt 方法

    destroy

    用于销毁 ThreadGroup,该方法只针对一个没有任何 active 线程的 group 进行一次标记,调用该方法直接结果是在父 group 中将自己移除

    守护 ThreadGroup

    需要注意的是,如果设置 ThreadGroup 的 daemon 为true,那么 group 中没有任何 active 线程时 group 自动销毁

    最新回复(0)