许多线程聚集成组即线程组,
线程组可以包括其他线程组,线程组随着层级的增加可形成树,其中的每个线程组除了初始化线程组外都存在着父线程组。
线程允许访问关于它自己的线程组的信息,但不允许访问其线程组的父线程组或任何其他线程组的信息。
当需要锁定策略的时候,线程组成子线程组到父线程组是尽可能地锁定一个级别的树,但是不锁住树的底部。这样可以限制需要持有的锁的数量,特别是避免为根线程组(或全局锁)获取锁,这锁将是多处理器系统中许多线程组争用的资源。这样的锁定策略通常会导致获取一个线程组状态的快照,并在该快照中工作,而不是在执行的时候将线程组锁住。
1.ThreadGroup初始化
ThreadGroup有提供构造方法,可以自行进行初始化设置或者自行交给Thread处理,因为在new Thread()时会默认初始化线程组ThreadGroup。关于ThreadGroup的初始化可以参考Thread的源码解析:http://ericchunli.iteye.com/blog/2394118。
2.ThreadGroup源码解析
public class ThreadGroup implements Thread.UncaughtExceptionHandler {
private final ThreadGroup parent; // 父线程组
String name; // 线程组名称
int maxPriority; // 线程组优先级
boolean destroyed; // 是否已经被销毁
boolean daemon; // 守护线程
boolean vmAllowSuspension; // 供VM使用
int nUnstartedThreads = 0; // 线程组中未启动的线程
int nthreads; // 线程数量
Thread threads[]; // 线程
int ngroups; // 线程组数量
ThreadGroup groups[]; // 线程组