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

本文介绍了一种使用Java代码以树状结构展示JVM中所有线程及其线程组的方法,包括线程名称、优先级及活动状态等关键信息。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值