在初识线程文章中,我们多次提到 ThreadGroup 的概念,在创建线程的时候如果没有显示指定 ThreadGroup , 那么新的线程会加入与父线程相同的 ThreadGroup 中,在本文中,将详细讲解有关 ThreadGroup 的知识
在Java程序中,默认情况下,新的线程都会加入到 main 线程所在的 group 中, main 线程的 group 和线程同名。和线程存在父子关系一样, ThreadGroup 也存在父子关系
无论如何,线程都会加入某个ThreadGroup 之中
第一个构造函数为 ThreadGroup 赋予名字,但是该 ThreadGroup 的父 ThreadGroup 是创建它线程所在的 ThreadGroup,第二个构造函数可以显示指定父 ThreadGroup
interrupt
该方法会导致该 group 中所有的 active 线程被 interrupt, 也就是该 group 中每一个线程的 interrupt 都被标识
public final void interrupt() { int ngroupsSnapshot; ThreadGroup[] groupsSnapshot; synchronized (this) { checkAccess(); for (int i = 0 ; i < nthreads ; i++) { threads[i].interrupt(); } ngroupsSnapshot = ngroups; if (groups != null) { groupsSnapshot = Arrays.copyOf(groups, ngroupsSnapshot); } else { groupsSnapshot = null; } } for (int i = 0 ; i < ngroupsSnapshot ; i++) { groupsSnapshot[i].interrupt(); } }该方法会执行所有 thread 的 interrupt 方法,并且递归获取子 group, 然后执行各自的 interrupt 方法
destroy
用于销毁 ThreadGroup,该方法只针对一个没有任何 active 线程的 group 进行一次标记,调用该方法直接结果是在父 group 中将自己移除
守护 ThreadGroup
需要注意的是,如果设置 ThreadGroup 的 daemon 为true,那么 group 中没有任何 active 线程时 group 自动销毁