线程组
线程组是java线程编程所持有的概念。在Java中,线程组是指java.lang.ThreadGroup类的对象,每个线程都隶属于唯一的一个线程组,这个线程组在线程创建时指定并在线程的整个生命周期内都不能更改。可以通过调用包含ThreadGroup类型参数的Thread类构造方法来指定线程所属线程组。若没有指定,则线程默认的隶属于名为main的系统线程组。除了预建的系统线程外,所以线程组都必须显式创建。
在java中除系统线程外的每个线程组又隶属于另一个线程组,可以在创建线程组时指定其所隶属的线程组,若没有指定,则默认地隶属于系统线程组。这样,所以线程组组成了一棵以系统线程组为根的树。
在Thread类里面也提供了几个引入ThreadGroup的构造方法。
Thread(ThreadGroupgroup,Runnabletarget) |
Thread(ThreadGroupgroup,Runnabletarget,Stringname) |
Thread(ThreadGroupgroup,Runnabletarget,Stringname,longstackSize) |
Thread(ThreadGroupgroup,Stringname) |
对ThreadGroup类的常用方法说明如下:
方法摘要
intactiveCount()
返回此线程组中活动线程的估计数。
intactiveGroupCount()
返回此线程组中活动线程组的估计数。
booleanallowThreadSuspension(booleanb)
已过时。此调用的定义取决于suspend(),它被废弃了。更进一步地说,此调用的行为从不被指定。
voidcheckAccess()
确定当前运行的线程是否有权修改此线程组。
voiddestroy()
销毁此线程组及其所有子组。
intenumerate(Thread[]list)
把此线程组及其子组中的所有活动线程复制到指定数组中。
intenumerate(Thread[]list,booleanrecurse)
把此线程组中的所有活动线程复制到指定数组中。
intenumerate(ThreadGroup[]list)
把对此线程组中的所有活动子组的引用复制到指定数组中。
intenumerate(ThreadGroup[]list,booleanrecurse)
把对此线程组中的所有活动子组的引用复制到指定数组中。
intgetMaxPriority()
返回此线程组的最高优先级。
StringgetName()
返回此线程组的名称。
ThreadGroupgetParent()
返回此线程组的父线程组。
voidinterrupt()
中断此线程组中的所有线程。
booleanisDaemon()
测试此线程组是否为一个后台程序线程组。
booleanisDestroyed()
测试此线程组是否已经被销毁。
voidlist()
将有关此线程组的信息打印到标准输出。
booleanparentOf(ThreadGroupg)
测试此线程组是否为线程组参数或其祖先线程组之一。
voidresume()
已过时。此方法只用于联合Thread.suspend和ThreadGroup.suspend时,因为它们所固有的容易导致死锁的特性,所以两者都已废弃。有关详细信息,请参阅Thread.suspend()。
voidsetDaemon(booleandaemon)
更改此线程组的后台程序状态。
voidsetMaxPriority(intpri)
设置线程组的最高优先级。
voidstop()
已过时。此方法具有固有的不安全性。有关详细信息,请参阅Thread.stop()。
voidsuspend()
已过时。此方法容易导致死锁。有关详细信息,请参阅Thread.suspend()。
StringtoString()
返回此线程组的字符串表示形式。
voiduncaughtException(Threadt,Throwablee)
当此线程组中的线程因为一个未捕获的异常而停止,并且线程没有安装特定Thread.UncaughtExceptionHandler时,由JavaVirtualMachine调用此方法。
<!--EndFragment-->
测试代码如下:【TestThreadGroup】
/** * TestThreadGroup.java * 版权所有(C) 2011 cuiran2001@163.com * 创建:崔冉 2011-1-12 下午12:48:06 */ package com.cayden.thread725; /** * @author 崔冉 * @version 1.0.0 * @desc */ public class TestThreadGroup { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub 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); } }
运行结果如下:
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
<!--EndFragment-->