JDK中线程组ThreadGroup

时间:2021-02-28 14:43:03

如果线程有100条...分散的不好管理...

线程同样可以分组ThreadGroup类.

线程组表示一个线程的集合。此外,线程组也可以包含其他线程组。线程组构成一棵树,在树中,除了初始线程组外,每个线程组都有一个父线程组。

允许线程访问有关自己的线程组的信息,但是不允许它访问有关其线程组的父线程组或其他任何线程组的信息。

如果t1线程不调用start方法的话并不会添加到mainGroup中,只有线程调用start()方法,线程运行起来才可以.  只能添加当前线程组活动的线程.

线程组有什么用呢?

线程组中有一个非常好的方法,

获得线程组之后可以知道这个线程组中的哪些线程是运行着的.每条线程是什么,都可以获得到.

enumerate(Thread[] list)
          把此线程组及其子组中的所有活动线程复制到指定数组中。

这个方法非常有意思....

可以知道线程组哪些线程还活着,哪些线程已经死了.然后根据这个做相应的处理.

再介绍一个parentGroup方法.  获得它的父线程组.

主线程组的父线程是system类的线程组.包含很多的线程,垃圾回收等....

 public class ThreadGroupDemo {

     public static void main(String[] args) {
Thread main = Thread.currentThread();
ThreadGroup mainGroup = main.getThreadGroup();
System.out.println(mainGroup);//输出:java.lang.ThreadGroup[name=main,maxpri=10] 主线程在一个叫做main的线程组中,最大优先级是10 mainGroup.list();//打印线程组的所有信息
/*
java.lang.ThreadGroup[name=main,maxpri=10]
Thread[main,5,main]
*/ //指定线程组是"myThread"
Thread t1 = new Thread(mainGroup,"myThread");
t1.start();//必须要调用start方法运行之后(活动的线程)才能添加到线程组中.
mainGroup.list();
/*
java.lang.ThreadGroup[name=main,maxpri=10]
Thread[main,5,main]
Thread[myThread,5,main]
*/ //通过线程组可以知道,这个线程组中有多少条线程是运行着的,有多少条线程,每条线程是什么都可以获取到.
Thread[] arr = new Thread[mainGroup.activeCount()];
main.enumerate(arr);//将线程组中活动的线程复制到指定数组中。
for (Thread thread : arr) {
System.out.println(thread.getName());//输出:main 和 myThread
} ThreadGroup parent = mainGroup.getParent();//获得父线程组.
parent.list();
/* main线程的父线程组中有system和垃圾回收相关的线程..
java.lang.ThreadGroup[name=system,maxpri=10]
Thread[Reference Handler,10,system]
Thread[Finalizer,8,system]
Thread[Signal Dispatcher,9,system]
Thread[Attach Listener,5,system]
java.lang.ThreadGroup[name=main,maxpri=10]
Thread[main,5,main]
*/ }
}