java ThreadGroup与线程池ThreadPoolExecutor非常有用

      我自己的理解也是一直以为ThreadGroup就是ThreadPoolExecutor(线程池),这是一个非常大的误会,最近把两者仔细分析了下。线程组表示一个线程的集合。此外,线程组也可以包含其他线程组。线程组构成一棵树,在树中,除了初始线程组外,每个线程组都有一个父线程组。允许线程访问有关自己的线程组的信息,但是不允许它访问有关其线程组的父线程组或其他任何线程组的信息;线程消耗包括内存和其它系统资源在内的大量资源。除了 Thread 对象所需的内存之外,每个线程都需要两个可能很大的执行调用堆栈。除此以外,JVM 可能会为每个 Java 线程创建一个本机线程,这些本机线程将消耗额外的系统资源。最后,虽然线程之间切换的调度开销很小,但如果有很多线程,环境切换也可能严重地影响程序的性能。线程池是因为线程的生成关闭很浪费资源 所以不要频繁的操作 线程次 就是管理线程的地方 不用了它可以让它休眠也就是他替你管理线程 而且比你管理的要好的多。线程池为线程生命周期开销问题和资源不足问题提供了解决方案。通过对多个任务重用线程,线程创建的开销被分摊到了多个任务上。其好处是,因为在请求到达时线程已经存在,所以无意中也消除了线程创建所带来的延迟。这样,就可以立即为请求服务,使应用程序响应更快。而且,通过适当地调整线程池中的线程数目,也就是当请求的数目超过某个阈值时,就强制其它任何新到的请求一直等待,直到获得一个线程来处理为止,从而可以防止资源不足。

       有时确定线程属于哪个线程组非常有用,ThreadGroup类包含用于创建及操纵线程组的方法。这样,甚至可以中断一个组中的所有线程。 activeCount方法报告组内活动线程及个数。enumerate将线和中活动的子线程复制到一个ThreadGroup引用数组中,其中一个方法使你能够递归地获得子线程组中所有活动线程组的copy。这里一个程序范例可以得到JVM启动后到底启动了哪些线程,他们的优先级是多少:

public class AllThread {
    public static Thread[] getAllThread() {
        ThreadGroup root = Thread.currentThread().getThreadGroup();
        ThreadGroup ttg = root;
        while ((ttg = ttg.getParent()) != null) root = ttg;
        Thread[] tlist = new Thread[(int)(root.activeCount() * 1.2)];
        return java.util.Arrays.copyOf(tlist, root.enumerate(tlist, true));
    }

    public static void main(String[] args) {
        Thread[] ts = getAllThread();
        for (Thread t : ts) {
            System.out.println(t.getId() + ": " + t.getName() + " " + t.getPriority());     }
}

你可能感兴趣的:(java,jvm,thread,多线程,活动)