线程组:可以有线程对象,也可以有线程组。(ThreadGroup)
线程组的作用是,可以批量的管理线程或线程组对象,有有效地对线程或线程组对象进行组织。
官方文档:https://docs.oracle.com/en/java/javase/12/docs/api/java.base/java/lang/ThreadGroup.html
线程对象关联线程组:1级关联。介绍:
1级关联就是父对象中有子对象,但并不创建子孙对象。
线程对象关联线程组:多级关联。介绍:
多级关联就是父对象中有子对象,子对象中再创建子对象,也就是有子孙对象。如果关系太复杂反而不利于开发管理,所以多级关联不常见。
实例验证多级关联:
下面通过文档对线程组进行了解:
类结构:
文档对线程组的描述:
线程组表示一组线程。此外,线程组还可以包括其他线程组。线程组形成一个树,其中除初始线程组之外的每个线程组都有父节点。
允许线程访问有关其自己的线程组的信息,但不允许访问有关其线程组的父线程组或任何其他线程组的信息。
ThreadGroup提供了很多的方法,这里先不做阐述:下面列出很多方法,也有很多方法已经过时,此处不做描述,只列举常见的几个方法:
先来了解线程组的操作情况:
- 1.线程组自动归属特性
- 2.获取根线程组
- 3.线程组里加线程组
- 4.组内的线程批量停止
- 5.递归与非递归取得组内对象
1.线程组自动归属特性
- 在实例化一个ThreadGroup线程x时如果不指定所属的线程组,则x线程自动归到当前线程对象所属的数组组中,也就是隐式地在一个线程组中添加一个子线程组,所以在控制台中打印的线程组数量值由0变成了1。
2.获取根线程组
运行结果给出说明了。
3.线程组里加线程组
此时成功在一个线程组中添加了一个子线程组。
4.组内的线程批量停止
创建一个线程:
通过将线程归属到线程组中,当调用线程组ThreadGroup的interrupt()方法时,可以将该组中的所有正在运行的线程批量停止。
5.递归与非递归取得组内对象
public class Run {
public static void main(String[] args) {
ThreadGroup mainGroup = Thread.currentThread().getThreadGroup();
ThreadGroup groupA = new ThreadGroup(mainGroup,"A");
Runnable runnable = new Runnable() {
@Override
public void run() {
try {
System.out.println("runMethod");
Thread.sleep(10000);//线程必须在运行状态才可以受组管理
} catch (InterruptedException e) {
e.printStackTrace();
}
}
};
ThreadGroup groupB = new ThreadGroup(groupA,"B");
//分配空间,但不一定全部用完
ThreadGroup[] listThreadGroups1 = new ThreadGroup[Thread.currentThread()
.getThreadGroup().activeGroupCount()];
//传入true是递归取得子组及子孙组
Thread.currentThread().getThreadGroup().enumerate(listThreadGroups1 , true);
for (int i = 0; i < listThreadGroups1.length; i++) {
if (listThreadGroups1[i] != null) {
System.out.println(listThreadGroups1[i].getName());
}
}
ThreadGroup[] listThreadGroups2 = new ThreadGroup[Thread.currentThread()
.getThreadGroup().activeGroupCount()];
Thread.currentThread().getThreadGroup().enumerate(listThreadGroups2, false);
for (int i = 0; i < listThreadGroups1.length; i++) {
if (listThreadGroups2[i] != null) {
System.out.println(listThreadGroups2[i].getName());
}
}
}
}