您的位置:首页 > 编程语言 > Java开发

Java多线程学习笔记(二) ThreadGroup

2019-10-11 07:05 2051 查看

1. 引子

Thread类有多个构造函数,其中一个如下:

public Thread(ThreadGroup group, String name) {
init(group, null, name, 0);
}

传入一个ThreadGroup参数,表示当前线程所属的线程组。源码中上面的init最终实现如下:

private void init(ThreadGroup g, Runnable target, String name,
long stackSize, AccessControlContext acc,
boolean inheritThreadLocals) {
......
if (g == null) {
g = parent.getThreadGroup();
}
}

可知:如果没有设置这个线程组,那么创建的线程的线程组即为其父线程的线程组,也就是当前线程。如果当前线程是main线程,main线程的group名字也叫main,那么在main方法中创建的新线程的group也是main。本文就ThreadGroup类进行学习。

2. 创建ThreadGroup

线程有父子之称,线程组也有父子之称。

ThreadGroup类的构造函数有:

public ThreadGroup(ThreadGroup parent, String name);
public ThreadGroup(String name) {
this(Thread.currentThread().getThreadGroup(), name);
}

构造函数可以指定当前创建的线程组的父线程组,如果没有指定就指定当前线程的线程组作为新创建的线程组的父线程组。

下面是一个demo进行验证,结果打印为true。

public static void main(String[] args) throws Exception {

ThreadGroup threadGroup = Thread.currentThread().getThreadGroup();

ThreadGroup threadGroup1 = new ThreadGroup("threadGroup1");

System.out.println(threadGroup1.getParent() == threadGroup);

}

2. ThreadGroup复制

一个线程组中可以添加多个线程和子线程组,可以使用其复制方法,复制出这些线程和线程组:

public int enumerate(Thread list[]);
public int enumerate(Thread list[], boolean recurse);

参数recurse为true表示递归将所有子线程组中的线程也拷贝到数组中,如果没有这个参数,默认就是true。

除了拷贝线程组中的线程以外,还可拷贝线程组中的子线程组:

public int enumerate(ThreadGroup list[]);
public int enumerate(ThreadGroup list[], boolean recurse);

recurse意思也是表示是否进行递归和拷贝。

3. 总结

线程组不是用来管理线程的,而是针对线程的一次组织。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Java