线程组ThreadGroup分析详解 多线程中篇(三)

线程组,顾名思义,就是线程的组,逻辑类似项目组,用于管理项目成员,线程组就是用来管理线程。每个线程都会有一个线程组,如果没有设置将会有些默认的初始化设置而在java中线程组则是使用类ThreadGroup进行抽象描述既然线程组是用来管理线程的,自然更多的是一种管理维度的抽象,所以很多方法也都是这个理念构造方法想要了解一个类的具体信息,第一个要看的就是构造方法,看一下最多的内容的那个构造方法就可以大...

线程组ThreadGroup分析详解 多线程中篇(三)
线程组,顾名思义,就是线程的组,逻辑类似项目组,用于管理项目成员,线程组就是用来管理线程。
每个线程都会有一个线程组,如果没有设置将会有些默认的初始化设置
而在java中线程组则是使用类ThreadGroup 进行抽象描述
既然线程组是用来管理线程的,自然更多的是一种管理维度的抽象,所以很多方法也都是这个理念

构造方法

想要了解一个类的具体信息,第一个要看的就是构造方法,看一下最多的内容的那个构造方法就可以大致了解到有哪些属性了
ThreadGroup有两个构造方法
image_5c5bc1e2_25a7
仔细看下这两个构造方法,其实只有一个了,那就是底层的私有的这一个
image_5c5bc1e2_7e2a
对于一个线程组来说,他拥有他自己的名字,也拥有他的优先级,也有是否是守护的说法
不同于线程,对于线程组来说,他是有记录自己的父线程组的,通过parent
另外,线程组也记录了自己下面有哪些线程组,使用数组记录,也就是构造方法中的 parent.add(this)
image_5c5bc1e2_41dc
所以一个线程组核心的信息是:名称、优先级、是否守护、父线程组、子线程组
image_5c5bc1e2_e8a
另外还有一个默认的构造方法,看注释,用来创建系统线程组
image_5c5bc1e2_71aa

名称

线程组的名称借助于内部的name属性持有
通过构造方法可以设置名称
提供了get方法用于获取名称
image_5c5bc1e3_311e

优先级

此处的优先级,表示的是最大允许优先级,线程组内最大就允许这么大
里面所有的线程不能继续变大,不要认为是记录了里面所有的线程中最大的那个值是一个天花板,不是一个记录尺
image_5c5bc1e3_41bb

daemon

image_5c5bc1e3_6ba7

父线程组

对于线程组来说,是明确的记录了他的父
借助于parent这个属性值,可以获取一个线程组的父线程组,也可以用来确定是否是一个指定线程组的父或者祖先
image_5c5bc1e3_4090

子线程组

内部借助于ThreadGroup 数组维护内部的线程组,从这个数据组织结构来看,就很显然,线程组内可以有线程组,可以层层嵌套形成树状结构的
对于线程组的创建,他必然会有一个父线程组(不设置就是当前线程所在的线程组了,也可以简单说当前线程组)
创建线程组的时候,就会借助于add方法,将这个线程组加入到父线程组维护的数组内
image_5c5bc1e3_57fc
对于任何一个线程,也都是拥有一个线程组,如果没有设置,将会将当前线程的线程组作为线程组,这个在前面已经说过
而在start方法中,又将当前线程添加到了线程组,请看下面的源码截图
image_5c5bc1e3_64b3
在回头看下这个add方法,借助于内部的线程数组,其实就是将这个线程添加到数组内
  • nThreads 记录的就是线程组内部的线程个数
  • nUnstartedThreads记录的是未启动的个数
刚刚调用线程的start方法,这个数就要减1,尽管可能这个瞬间线程可能并没有真正的启动,确保能够明确的声明线程组内有启动的线程了
image_5c5bc1e3_4549
所以就由这几项数据组成了线程组的树形结构
也就是说
  • 每个线程组也都知道自己包含多少个线程,哪些线程;
  • 每个线程组也都知道自己包含了多少个线程组,哪些线程组;
这是一份很重要的信息,借助于这些信息就完全串联起来了
image_5c5bc1e3_5044

子线程组相关方法

既然是树形结构,那么自然可能有枚举节点的需求
ThreadGroup中提供了两类enumerate方法,看名字应该就可以理解含义了,用于枚举线程和线程组
im</div><div>源文地址:<span id=https://www.guoxiongfei.cn/cntech/9865.html