在Java中,线程组是指java.lang.TheadGroup类的对象,每个线程都隶属于唯一的个线程组,这个线程组在线程创建时指定井在线程的整个生命期内都不能更改。可以通过调用包含ThreadGroup类型参数的Thread 类构造方法来指定线程所属的线程组: 若没有指定,则线程默认地隶属于名为main 的系统线程组。除了预建的系统线程组外,所有线程组都必须显式创建。
在Java中,除系统线程组外的每个线程组又隶属于另一个线程组,可以在创建线程组时指定其所隶属的线程组,若没有指定,则默认地隶属于系统线程组。这样,所有线程组组成了一棵以系统线程组为根的树。
在引入ThreadGroup类之后,我们在创建线程方面又多了几个可供选择的Thread类的构造力法。
(1)、Thread(ThreadGroup group,String name);: 创建一个隶属于线程组group 的线程,以name 为名称。
(2)、Thead(ThreadGroup group,Rumable target): 根据实现Runnable接口的target对象创建一个隶属于线程组group的线程。
(3)、Thread(TheadGrop group,Runnable target,String name); 根据实现 Rnnable接口的target 对象创建一个隶属于线程组group的线程以name 为名称。新线程以stackSize 为最大堆栈大小,如果超出则抛出StackOverflowError。stackSize参数具有高度的平台依赖性,在有些平台上不发挥作用。
此外,利用Thread类的getThreadGroup方法可以确定该线程属于哪一个线程组。例如,打印当前线程所在的线程组的名称:
System.out.println(Thread.currentThread().getThreadGroup().getName());
对ThreadGroup类的常用方法说明如下
ThreadGroup(String name ):创建一个线程组,以name 为名称。
ThreadGroup(ThreadGroup parent,String name) 创建个以parent 为父组的线程组,以name为名称。
int activeCount( ):获取本线程组中的活动线程数。
int ativeGropCount(): 获取本线程组中的活动线程组数。
int enumerate(Thread[ ] list):将本线程组,以及了线程组中的活动线程放入list数组中,返回实际放入数组中的线程数(数组容量可能不够存放全部的线程)。
int enumerate(Thead[] list,.boolean ecurse); 将本线程组中的活动线程放入list数组中,如果ecurse为true 则同时将子线程组中的活动线程放入list 数组中。返回实际放入数组中的线程数(数组容量可能不够存放全部的线程》。
int enumerate(ThredGroup list); 将本线程组,以及子线程组中的活动线程组放入list 数组中。返回实际放入数组中的线程组数(数组容量可能不够存放全部的线程组)。
int enumerate(ThreadGroup[] list.boolean recurse): 将本线程组中的活动线程组放入list 数组中,如果recurse 为true,则同时将子线程组中的活动线程组放入list数组中。返回实际放入数组中的线程组数(数组容量可能不够存放全部的线程组)。
void setMaxPrioity(int pri): 设省本线程组,以及子线程组中的所有线程房能拥的最高优先级。设置结果对已经拥有更高优先级的线程没有影响。如果试图对本线程组,以及子线程组中的线程投予比pri 更高的优先级,JVM 将自动将其降为pri。
int getMaxPrority( ): 获取本线程组,以及子线程组中的所有线程所能拥有的最高优先级。
String getName(): 获取线程组名称
ThreadGroup getParent( ): 获取父线程组。
void setDaemon(boolean daemon):设置本线程组,以及子线程组中的线程是否为守护线程。
boolean isDaemon() 返回本线程组,以及子线程组中的线程是否为守护线程。
void interrupt(); 对本线程组,以及子线程组的线程发出中断请求。
void list(); 将有关此线程组的信息打印到标准输出。
下面的例程演示线程组的常用方法。源代码如下:
public class TestThreadGroup
{
public static void main(String[] args)
{
ThreadGroup tg1=new ThreadGroup("thread_group1");
Thread thread1=new Thread(tg1,"thread1");
Thread thread2=new Thread(tg1,"thread2");
tg1.list();
tg1.setDaemon(true);
System.out.println(tg1.getName()+"的父线程组是:"+tg1.getParent().getName());
thread1.start();
Thread[] threadArray1=new Thread[tg1.activeCount()];
tg1.enumerate(threadArray1,false);
System.out.println(tg1.getName()+"的活动线程有:"+threadArray1.length);
ThreadGroup[] threadGroupArray1=new ThreadGroup[tg1.activeGroupCount()];
tg1.enumerate(threadGroupArray1,false);
System.out.println(tg1.getName()+"的活动线程组有:"+threadGroupArray1.length);
ThreadGroup tg2=new ThreadGroup(tg1,"thread_group2");
Thread thread3=new Thread(tg2,"thread3");
Thread thread4=new Thread(tg2,"thread4");
tg2.list();
tg2.setDaemon(true);
System.out.println(tg2.getName()+"的父线程组是:"+tg2.getParent().getName());
Thread[] threadArray2=new Thread[tg2.activeCount()];
tg2.enumerate(threadArray2,false);
System.out.println(tg2.getName()+"的活动线程有:"+threadArray2.length);
ThreadGroup[] threadGroupArray2=new ThreadGroup[tg2.activeGroupCount()];
tg2.enumerate(threadGroupArray2,false);
System.out.println(tg2.getName()+"的活动线程组有:"+threadGroupArray2.length);
}
}
运行结果如下:
E:\>java TestThreadGroup
java.lang.ThreadGroup[name=thread_group1,maxpri=10]
thread_group1的父线程组是:main
thread_group1的活动线程有:1
thread_group1的活动线程组有:0
java.lang.ThreadGroup[name=thread_group2,maxpri=10]
thread_group2的父线程组是:thread_group1
thread_group2的活动线程有:0
thread_group2的活动线程组有:0