ThreadGroup 复制线程的两个方法。
public int enumerate(Thread list[]) // 会将 ThreadGroup 中的 active 线程全部复制到 Thread 数组中,它等价于 enumerate(list,true)
public int enumerate(Thread list[], boolean recurse) // 会将 ThreadGroup 中的 active 线程全部复制到 Thread 数组中,如果 recurse = true,则该方法会将所有子 group 中的 active 线程都递归到 Thread 数组中
上面两个方法都会调用下面这个方法。
private int enumerate(Thread list[], int n, boolean recurse) {
int ngroupsSnapshot = 0;
ThreadGroup[] groupsSnapshot = null;
synchronized (this) {
if (destroyed) {
return 0;
}
int nt = nthreads;
if (nt > list.length - n) {
nt = list.length - n;
}
for (int i = 0; i < nt; i++) {
if (threads[i].isAlive()) {
list[n++] = threads[i];
}
}
if (recurse) {
ngroupsSnapshot = ngroups;
if (groups != null) {
groupsSnapshot = Arrays.copyOf(groups, ngroupsSnapshot);
} else {
groupsSnapshot = null;
}
}
}
if (recurse) {
for (int i = 0 ; i < ngroupsSnapshot ; i++) {
n = groupsSnapshot[i].enumerate(list, n, true);
}
}
return n;
}
package concurrent;
import java.util.concurrent.TimeUnit;
public class Enumerate {
public static void main(String[] args) {
// 创建一个线程组
ThreadGroup myGroup = new ThreadGroup("MyGroup");
// 创建线程传入 myGroup
Thread thread = new Thread(myGroup, () -> {
while (true) {
try {
TimeUnit.SECONDS.sleep(1);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}, "MyThread");
thread.start();
try {
TimeUnit.MILLISECONDS.sleep(2);
} catch (InterruptedException e) {
e.printStackTrace();
}
ThreadGroup mainGroup = Thread.currentThread().getThreadGroup();
Thread[] list = new Thread[mainGroup.activeCount()];
int recurseSize = mainGroup.enumerate(list);
System.out.println(recurseSize);
recurseSize = mainGroup.enumerate(list, false);
System.out.println(recurseSize);
}
}
2
1
首先定义一个 ThreadGroup,并且将该 group 加入到 main group 中,然后定义一个线程 thread 并其加入 myGroup 中,最后分别调用 enumerate 的递归和非递归方法。
上面的代码运行之后,最后一个输出会比第一个少1,那是因为代码中将递归 recurse 设置为 false,myGroup 中的线程将不会包含在内。
版权说明 : 本文为转载文章, 版权归原作者所有 版权申明
原文链接 : https://blog.csdn.net/chengqiuming/article/details/123607310
内容来源于网络,如有侵权,请联系作者删除!