一、简介在之前的多线程系列文章中,我们陆陆续续的介绍了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:sub1
3.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()将此线程组的信息打印到标准输出 。此方法仅用于调试 下面我们抽取几个比较常见的方法,进行演示介绍 。
推荐阅读
- 互联网大厂是如何设计和使用缓存的?方案已开源!
- 网络安全学什么专业能做网络安全工程师?
- 10亿数据如何最快插入MySQL?
- 为什么有的网站不更新文章也有很好的排名?
- 退伍兵贷款该找什么部门
- TikTok全托管模式是什么?如何解读新模式
- TikTok如何选品?打造爆款不是梦
- 外国人喜欢什么?看看他们的网红就知道了!
- 退房时酒店为什么不再查房了?前台工作人员说出真相,原来如此!
- 茶叶是酸性还是碱性的?如果茶叶出现酸味,属于正常现象吗?