线程学习笔记(十一)-查看JVM中所有的线程和线程组

来源:互联网 发布:中华书局知乎 编辑:程序博客网 时间:2024/06/05 09:21
本实例介绍如何以树状结构查看Java虚拟机中所有的线程和线程组以及线程的优先级等信息。
查看Java虚拟机(JVM)中所有的线程和线程的技术要点如下:
虚拟机中的任何线程都处于线程组ThreadGroup中,线程组也可以包含子线程组。
Thread的currentThread静态方法能够获得当前线程的引用。
Thread的getThreadGroup实例方法能够获得当前线程所属的线程组。
ThreadGroup的getParent实例方法能够获得当前线程组的父线程组,根线程组的父线程组为null。
package core;public class TextRunningThread {//操作查看JVM虚拟机中所有的线程和线程组的类public static void listAllThreads(){//找到根线程组并列出它递归的信息ThreadGroup currentThreadGroup;//当前线程组ThreadGroup rootThreadGroup;//根线程组ThreadGroup parent;currentThreadGroup=Thread.currentThread().getThreadGroup();//获取当前活动线程所在的线程组rootThreadGroup=currentThreadGroup;//赋值给变量-根线程组parent=rootThreadGroup.getParent();//获取上级线程组/上级线程while(parent != null){//循环对根线程组重新赋值rootThreadGroup=parent;parent=rootThreadGroup.getParent();}showThreadGroup(rootThreadGroup, "");}public static void showThreadGroup(ThreadGroup group,String index){//显示线程组信息if(group == null) return;//线程组为空,直接返回int count=group.activeCount(); //获取活动的线程int countGroup=group.activeGroupCount();//获取活动的线程组数//System.out.println("活动的线程  : "+count);//System.out.println("活动的线程组数  : "+countGroup);Thread[] threads=new Thread[count];ThreadGroup[] groups=new ThreadGroup[countGroup];//把当前组下的所有活动线程/线程组的引用复制到指定数组中,false表示不包括对当前组下活动线程组的线程/线程组的引用group.enumerate(threads, false);//把线程放到当前的ThreadGroup中group.enumerate(groups, false);//把线程组放到当前的ThreadGroup中System.out.println(index+"线程组的名称- "+group.getName()+" 最高优先级- "+group.getMaxPriority()+(group.isDaemon()?" 守护":" "));for (int i = 0; i < count; i++) {showThread(threads[i],index+"  ");// 展示ThreadGroup中所包含的线程的信息}for (int i = 0; i < countGroup; i++) {// 展示ThreadGroup中所包含的线程组的信息showThreadGroup(groups[i],index+"  ");//递归调用方法展示ThreadGroup中所包含的线程组中的信息}}public static void showThread(Thread thread,String index){if(thread == null) return;System.out.println(index+"线程的名称-"+thread.getName()+" 最高优先级- "+thread.getPriority()+(thread.isDaemon()?" 守护":" ")+(thread.isAlive()?" 活动":" 不活动"));}public static void main(String[] args) {TextRunningThread.listAllThreads();}}

源程序解读
showThread()方法是显示线程的信息,包括线程的名称,优先级,是否为守护线程以及线程是否处在活动状态。
showThreadGroup()方法显示线程组的信息,ThreadGroup的activeCount()方法获得线程组中活动的线程数,activeGroupCount()获得活动的线程组数。根据线程数和线程组数分别创建数组和线程组数组。enumerate()方法把所有活动的子组的引用复制到指定数组中,false表示不包含对子组的所有活动子组的引用。运用循环调用showThread()方法显示每个线程的信息,再调用showThreadGroup()方法递归显示线程组中的线程信息,其中的第二个参数 index+" "用于把数据以树状列表展示。
listAllThreads()方法找到根线程组并列出它通过递归显示的信息。Thread类的currentThread()方法是获得当前线程。getThreadGroup()方法是获得当前活动的线程组。ThreadGroup类的getParent()方法获得根线程。运用根线程不为空条件进行循环,获得每个线程的根线程,再调用showThreadGroup()方法以树状结构展示线程信息。