ThreadGroup
在主线程创建得线程,如果没有给他指定线程组,那么创建的线程,默认和主线程同一个线程组。线程组可以底下可以是线程,也可以实线程组。
构建线程组的方法:
private ThreadGroup()
public ThreadGroup(String name)
public ThreadGroup(ThreadGroup parent, String name)
private ThreadGroup(Void unused, ThreadGroup parent, String name)
public class Demo { public static void main(String[] args) { //获取当前线程所属的线程组 ThreadGroup g1 = Thread.currentThread().getThreadGroup(); //定义一个线程组 ThreadGroup g2 = new ThreadGroup("g2"); //判断当前线程所属的线程组的父线程 System.out.println(g2.getParent()==g1);//true //定义新得线程,在之前得线程组之上 ThreadGroup g3 = new ThreadGroup(g2,"g3"); System.out.println(g3.getParent()==g2);//true } }
复制Thread数组和ThreadGroup数组
复制Thread数组
public int enumerate(Thread[] list)
public int enumerate(Thread[] list,boolean recurse)
上面的两个方法实际上是讲ThreadGroup中的active线程全部复制到Thread数组中,其中recurse参数是true,则该方法会将所有的子group的active线程都递归到Thread数组中,通过源码可以得知enumerate(Thread[],true)==enumerate(list),这两个方法都是调用的 private int enumerate(Thread list[], int n, boolean recurse)
public int enumerate(Thread list[]) {
checkAccess();
return enumerate(list, 0, true);
}
public int enumerate(Thread list[], boolean recurse) {
checkAccess();
return enumerate(list, 0, recurse);
}
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;
}
执行结果:32
复制ThreadGroup
public int enumerate(ThreadGroup list[])
public int enumerate(ThreadGroup list[], boolean recurse)
public class ThreadGroupEnumerateThreadGroupsDemo { public static void main(String[] args) throws InterruptedException { ThreadGroup g1 = new ThreadGroup("g1"); ThreadGroup g2 = new ThreadGroup(g1,"g2"); TimeUnit.MILLISECONDS.sleep(2); ThreadGroup mainGroup = Thread.currentThread().getThreadGroup(); ThreadGroup[] list = new ThreadGroup[mainGroup.activeCount()]; int recurseSize = mainGroup.enumerate(list); System.out.println(recurseSize); recurseSize = mainGroup.enumerate(list,false); System.out.println(recurseSize); } }
执行结果:21
ThreadGroup的基本操作
activeGcount()用于获取group中活跃的线程,这只是个估值。
activeGroupCount()用于获取group中活跃的子group,这也是一个近似估值,该方法也会递归获取所有的子group。
getMaxPriority()用于获取group的优先级,默认情况下,Group的优先级为10,在该group中,所有的线程的优先级不能大于group的优先级。
getName():或与group的名字。
getParent()获取group的父group,有就返回,没有就返回null。
list():该方法没有返回值,执行该方法会将group中所有的活跃的线程信息全部输出到控制台。
parentOf(ThreadGroup g):会判断当前的group的是不是给定group的父group,另外如果给定大group的是给自己本身,那么高返回true。
setMaxPriority(int pri)会指定group的最大优先级,最大优先级不能超过父group的最大优先级,该方法会把当前的线程组和子线程组的优先级都有影响。