查看JVM中所有的线程和线程组

概要:

本实例介绍如何以树状结构查看Java虚拟机中所有的线程和线程组以及线程的优先级等信息。

| |目录

技术要点

查看Java虚拟机(JVM)中所有的线程和线程组的技术要点如下:

  • 虚拟机中的任何线程都处于线程组ThreadGroup中,线程组也可以包含子线程组。

  • Thread的currentThread静态方法能够获得当前线程的引用。

  • Thread的getThreadGroup实例方法能够获得当前线程所属的线程组。

  • ThreadGroup的getParent实例方法能够获得当前线程组的父线程组,根线程组的父线程组为null。

代码实现

package net.xsoftlab.baike;
public class TextRunningThread {
	private static void showThread(Thread thread, String index) {// 显示线程信息
		if (thread == null)
			return;
		System.out.println(index + "线程名称 - " + thread.getName() + "  线程优先级 - "
				+ thread.getPriority() + (thread.isDaemon() ? " 守护" : "")
				+ (thread.isAlive() ? "" : " 不活动"));
	}
	private static void showThreadGroup(ThreadGroup group, String index) {// 显示线程组信息
		if (group == null)
			return;// 判断线程组
		int count = group.activeCount();// 获得活动的线程数
		int countGroup = group.activeGroupCount();// 获得活动的线程组数
		Thread[] threads = new Thread[count];// 根据活动的线程数创建指定个数的线程数组
		ThreadGroup[] groups = new ThreadGroup[countGroup];// 根据活动的线程组数创建指定个数的线程组数组
		group.enumerate(threads, false);// 把所有活动子组的引用复制到指定数组中,false表示不包括对子组的所有活动子组的引用
		group.enumerate(groups, false);
		System.out.println(index + "线程组的名称 - " + group.getName() + " 最高优先级 - "
				+ group.getMaxPriority() + (group.isDaemon() ? " 守护" : " "));
		for (int i = 0; i < count; i++)
			// 循环显示当前活动的线程信息
			showThread(threads[i], index + "");// 调用方法
		for (int i = 0; i < countGroup; i++)
			// 循环显示当前活动的线程组信息
			showThreadGroup(groups[i], index + "");// 递归调用方法
	}
	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 = parent.getParent();
		}
		showThreadGroup(rootThreadGroup, "");// 显示根线程组
	}
	public static void main(String[] args) {// java程序主入口处
		TextRunningThread.listAllThreads();// 调用方法显示所有线程的信息
	}
}

程序解读

  1. TextRunningThread类的showThread()静态方法是显示线程的信息,包括线程的名称、优先级、是否是守护线程以及线程是否处在活动状态。

  2. showThreadGroup()静态方法显示线程组的信息,ThreadGroup类activeCount()方法获得线程组中活动的线程数,activeGroupCount()方法获得活动的线程组数。根据线程数和线程组数分别创建线程数组和线程组数组。enumerate()方法把所有活动的子组的引用复制到指定数组中,false表示不包括对子组的所有活动子组的引用。运用循环调用showThread()方法显示每个线程的信息,调用showThreadGroup()方法递归显示线程组中线程的信息。

  3. listAllThreads()方法找到根线程组并列出它通过递归显示的信息。Thread类的currentThread()方法是获得当前线程,getThreadGroup()方法是获得当前活动的线程组。ThreadGroup类的getParent()方法获得根线程。运用根线程不为空条件进行循环,获得每个线程的根线程,再调用showThreadGroup()方法以树状结构显示线程信息。


评论关闭
评论 还能输入200
评论关闭
评论 还能输入200
  • 全部评论(0)
资料加载中...
已关注 , 取消