什么是线程组?你学会了吗?

一、简介在之前的多线程系列文章中,我们陆陆续续的介绍了Thread线程类相关的知识和用法,其实在Thread类上还有一层ThreadGroup类 , 也就是线程组 。
今天我们就一起来简单的聊聊线程组相关的知识和用法 。
二、什么是线程组线程组,简单来说就是多个线程的集合,它的出现主要是为了更方便的管理线程 。
从结构角度看,线程组与线程之间其实是一个父子结构,一个线程组可以拥有几个线程,同时也可以拥有几个线程组 。整个组织结构像一棵树一样,每个线程一定有一个线程组,线程组可能又有一个父线程组,追溯到根节点就是一个系统线程组 。
线程组与线程之间的关系,可以用如下图来描述 。

什么是线程组?你学会了吗?

文章插图
比如,我们通常创建的mAIn方法,对应的是main线程,它所属的是main线程组 , main线程组的父级是是system系统线程组 。
public static void main(String[] args) {    Thread currentThread = Thread.currentThread();    ThreadGroup currentThreadGroup = currentThread.getThreadGroup();    ThreadGroup systemThreadGroup = currentThreadGroup.getParent();    System.out.println("currentThread:" + currentThread.getName());    System.out.println("currentThreadGroup:" + currentThreadGroup.getName());    System.out.println("systemThreadGroup:" + systemThreadGroup.getName());}输出结果如下:
currentThread:maincurrentThreadGroup:mainsystemThreadGroup:system其中system线程组就是根节点,再上一层就没有了,如果调用会抛空指针异常 。
线程组最主要的作用是:可以实现批量管理线程或者线程组,有效的对线程或者线程组对象进行检查、尝试中断等操作 。
下面我们就一起来看看ThreadGroup的常用方法和使用技巧 。
三、线程组用法详解3.1、构造方法介绍ThreadGroup提供了两个构造方法,内容如下:
方法描述 ThreadGroup(String name)根据线程组名称创建线程组,其父线程组为main线程组ThreadGroup(ThreadGroup parent, String name)根据线程组名称创建线程组,其父线程组为指定的 parent 线程组 其中支持指定父级线程组的方法,在实际的使用中比较常见 。
下面 , 我们演示一下这两个构造函数的用法:
public static void main(String[] args) {    ThreadGroup subThreadGroup1 = new ThreadGroup("sub1");    ThreadGroup subThreadGroup2 = new ThreadGroup(subThreadGroup1, "sub2");    System.out.println("sub1 parent thread group name:" + subThreadGroup1.getParent().getName());    System.out.println("sub2 parent thread group name:" + subThreadGroup2.getParent().getName());}输出结果如下:
sub1 parent thread group name:mainsub2 parent thread group name:sub13.2、核心方法介绍ThreadGroup提供了很多有用的方法,下面整理了一些方法的简要介绍 , 内容如下:
方法描述 public final String getName()返回此线程组的名称public final ThreadGroup getParent()返回此线程组的父级public final boolean parentOf(ThreadGroup g)测试此线程组是线程组参数还是其父级线程组之一public int activeCount()返回此线程组及其子组中活动线程的数量的估计值,递归遍历该线程组中所有的子组 , 此方法主要用于调试和监视目的public int activeGroupCount ()返回此线程组及其子组中活动组的数目的估计值 。递归遍历该线程组中的所有子群,此方法主要用于调试和监视目的public final void checkAccess()确定当前运行的线程是否具有修改此线程组的权限public int enumerate(Thread[] list)将这个线程组复制到它所在的组及其子组中public final void destroy()销毁此线程组及其所有子组,当线程组还要子线程或者子线程组,会抛异常public boolean isDestroyed()测试此线程组是否已被销毁public final int getMaxPriority()返回此线程组的最大优先级public final void setMaxPriority(int pri)设置组的最大优先级 。线程组中具有较高优先级的线程不会受到影响public final boolean isDaemon()测试此线程组是否是守护线程组public final void setDaemon(boolean daemon)修改此线程组的守护进程状态public final void interrupt()尝试中断此线程组中的所有线程public void list()将此线程组的信息打印到标准输出 。此方法仅用于调试 下面我们抽取几个比较常见的方法,进行演示介绍 。


推荐阅读