ThreadGroup 详细讲解

ThreadGroup 详细讲解

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

1. ThreadGroup 与 Thread

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

ThreadGroup 详细讲解_第1张图片

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

2. 创建 ThreadGroup

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

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

3. ThreadGroup 操作

  • active() 用于获取 group 中活跃的线程
  • activeGroupCount() 用去 group 中活跃的子 group
  • getMaxPriority() 获取 group 的优先级,默认为10
  • getName() 获取 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 自动销毁

你可能感兴趣的:(并发)