本实例介绍如何以树状结构查看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()方法以树状结构展示线程信息。