Java - ThreadGroup
ThreadGroup介绍
线程组(ThreadGroup)简单来说就是一个线程集合,线程组的出现是为了更方便地管理线程。
线程组是父子结构的,一个线程组可以继承其他线程组,同时也可以拥有其他子线程组。从结构上看,线程组是一个树形结构,每个线程都隶属于一个线程组,线程组又有父线程组,这样追溯下去,可以追溯到一个根线程组——System线程组。
JVM内置线程组
- system线程组:是用来管理处理JVM的系统任务的线程组,例如对象的销毁等。是所有线程组的根线程组;
- main线程组:system线程组是main线程组的parent,是应用程序创建的线程组,主要用于执行main方法。
可以通过测试代码查看内置线程组信息:
public static void main(String[] args) {
System.out.println(Thread.currentThread().getThreadGroup().getName());
System.out.println(Thread.currentThread().getThreadGroup().getParent().getName());
System.out.println(Thread.currentThread().getThreadGroup().getParent().getParent());
}
控制台输出结果:
main
system
null
如何创建线程组
通过查看ThreadGroup的构造方法,发现主要有三个构造方法:
/**
* Creates an empty Thread group that is not in any Thread group.
* This method is used to create the system Thread group.
*/
private ThreadGroup() { // called from C code
this.name = "system";
this.maxPriority = Thread.MAX_PRIORITY;
this.parent = null;
}
public ThreadGroup(String name) {
this(Thread.currentThread().getThreadGroup(), name);
}
public ThreadGroup(ThreadGroup parent, String name) {
this(checkParentAccess(parent), parent, name);
}
- 第一个无参构造器是私有的,通过代码注释可以看到,这个构造方法应该是用来构造system线程组的,所以不对外提供;
- 第二个构造器重载了ThreadGroup(ThreadGroup parent, String name),只不过是父线程组参数传入了当前线程所处的线程组,然后在传入一个自定义线程组名称;
- 第三个构造器可以支持用户自定义新创建的线程组的父线程组和线程组名称。
所以创建线程组一共有两种方式,一种是只传入自定义线程组名称,则新创建的线程组的父线程组则是当前负责创建新线程组的线程所属于的线程组。如果在main方法创建一个自定义线程组,则新定义线程组的父线程组则是main线程组。
如何使用线程组
ThreadGroup提供了很多有用的方法,可以方便我们管理线程组中的所有线程。
image.png
比如interrupt(); 它可以将整个线程组的所有线程进行打断操作;方便我们对所有线程进行统一打断处理。
网友评论