线程组是java线程编程所持有的概念。在Java中,线程组是指java.lang.ThreadGroup类的对象,每个线程都隶属于唯一的一个线程组,这个线程组在线程创建时指定并在线程的整个生命周期内都不能更改。可以通过调用包含ThreadGroup类型参数的Thread类构造方法来指定线程所属线程组。若没有指定,则线程默认的隶属于名为main的系统线程组。除了预建的系统线程外,所以线程组都必须显式创建。
在java中除系统线程外的每个线程组又隶属于另一个线程组,可以在创建线程组时指定其所隶属的线程组,若没有指定,则默认地隶属于系统线程组。这样,所以线程组组成了一棵以系统线程组为根的树。
在Thread类里面也提供了几个引入ThreadGroup的构造方法。
Thread(ThreadGroup group, Runnable 分配新的 Thread 对象。 |
Thread(ThreadGroup group, Runnable target, String 分配新的 Thread 对象,以便将 target 作为其运行对象,将指定的 name 作为其名称,并作为 group 所引用的线程组的一员。 |
Thread(ThreadGroup group, Runnable target, String 分配新的 Thread 对象,以便将 target 作为其运行对象,将指定的 name 作为其名称,作为 group 所引用的线程组的一员,并具有指定的堆栈大小。 |
Thread(ThreadGroup group, String 分配新的 Thread 对象。 |
对ThreadGroup类的常用方法说明如下:
方法摘要
int activeCount()
返回此线程组中活动线程的估计数。
int activeGroupCount()
返回此线程组中活动线程组的估计数。
boolean allowThreadSuspension(boolean b)
已过时。 此调用的定义取决于 suspend(),它被废弃了。更进一步地说,此调用的行为从不被指定。
void checkAccess()
确定当前运行的线程是否有权修改此线程组。
void destroy()
销毁此线程组及其所有子组。
int enumerate(Thread[] list)
把此线程组及其子组中的所有活动线程复制到指定数组中。
int enumerate(Thread[] list, boolean recurse)
把此线程组中的所有活动线程复制到指定数组中。
int enumerate(ThreadGroup[] list)
把对此线程组中的所有活动子组的引用复制到指定数组中。
int enumerate(ThreadGroup[] list, boolean recurse)
把对此线程组中的所有活动子组的引用复制到指定数组中。
int getMaxPriority()
返回此线程组的最高优先级。
String getName()
返回此线程组的名称。
ThreadGroup getParent()
返回此线程组的父线程组。
void interrupt()
中断此线程组中的所有线程。
boolean isDaemon()
测试此线程组是否为一个后台程序线程组。
boolean isDestroyed()
测试此线程组是否已经被销毁。
void list()
将有关此线程组的信息打印到标准输出。
boolean parentOf(ThreadGroup g)
测试此线程组是否为线程组参数或其祖先线程组之一。
void resume()
已过时。 此方法只用于联合 Thread.suspend 和 ThreadGroup.suspend 时,因为它们所固有的容易导致死锁的特性,所以两者都已废弃。有关详细信息,请参阅 Thread.suspend()。
void setDaemon(boolean daemon)
更改此线程组的后台程序状态。
void setMaxPriority(int pri)
设置线程组的最高优先级。
void stop()
已过时。 此方法具有固有的不安全性。有关详细信息,请参阅 Thread.stop()。
void suspend()
已过时。 此方法容易导致死锁。有关详细信息,请参阅 Thread.suspend()。
String toString()
返回此线程组的字符串表示形式。
void uncaughtException(Thread t, Throwable e)
当此线程组中的线程因为一个未捕获的异常而停止,并且线程没有安装特定 Thread.UncaughtExceptionHandler 时,由 Java Virtual Machine 调用此方法。
<!--EndFragment--><!--EndFragment-->
<!--EndFragment-->
测试代码如下:【TestThreadGroup】
view plain copy to clipboard print ?
1. /**
2. * TestThreadGroup.java
3. * 版权所有(C) 2011 cuiran2001@163.com
4. * 创建:崔冉 2011-1-12 下午12:48:06
5. */
6.
7. package com.cayden.thread725;
8.
9. /**
10. * @author 崔冉
11. * @version 1.0.0
12. * @desc
13. */
14. public class TestThreadGroup {
15.
16. /**
17. * @param args
18. */
19. public static void
20. // TODO Auto-generated method stub
21. new ThreadGroup("thread_group1");
22. new Thread(tg1,"thread1");
23.
24. new Thread(tg1,"thread2");
25.
26. tg1.list();
27.
28. true);
29. "的父线程组是"+tg1.getParent().getName());
30.
31. thread1.start();
32. new
33.
34. false);
35.
36. "的活动线程有"+threadArray1.length);
37.
38. new
39. false);
40.
41. "的活动线程组有"+threadGroupArray1.length);
42.
43.
44. new ThreadGroup(tg1,"thread_group2");
45. new Thread(tg2,"thread3");
46. new Thread(tg2,"thread4");
47.
48. tg2.list();
49.
50. true);
51. "的父线程组是"+tg2.getParent().getName());
52.
53. new
54.
55. false);
56. "的活动线程有"+threadArray2.length);
57.
58. new
59. false);
60.
61. "的活动线程组有"+threadGroupArray2.length);
62.
63. }
64.
65. }
/** * 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); } }
运行结果如下:
view plain copy to clipboard print ?
1. java.lang.ThreadGroup[name=thread_group1,maxpri=10]
2. thread_group1的父线程组是main
3. thread_group1的活动线程有1
4. thread_group1的活动线程组有0
5. java.lang.ThreadGroup[name=thread_group2,maxpri=10]
6. thread_group2的父线程组是thread_group1
7. 0
8. 0