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数组

  1. public int enumerate(Thread[] list)

  2. 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

  1. public int enumerate(ThreadGroup list[])

  2. 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的最大优先级,该方法会把当前的线程组和子线程组的优先级都有影响。

01-20 12:20