1. 程式人生 > >【多執行緒】檢視JVM中的執行緒名(ThreadGroup)

【多執行緒】檢視JVM中的執行緒名(ThreadGroup)

ThreadGroup類的常用方法

activeCount()——返回此執行緒組中活動執行緒的估計數

activeGroupCount()——返回此執行緒組中活動執行緒組的估計數

enumerate(Thread[] list,boolean recurse)——把此執行緒組中所有活動執行緒複製到指定陣列中

enumerate(ThreadGroup[] list,boolean recurse)——把對此執行緒中的所有活動子組的引用複製到指定陣列中

getName()——返回此執行緒組的名稱

getParent()——返回此執行緒組的父執行緒組

/**
	 * 獲得根執行緒組
	 * @return
	 */
	private static ThreadGroup getRootThreadGroups(){
		//獲得當前執行緒組
		ThreadGroup rootGroup =Thread.currentThread().getThreadGroup();
		while(true){
			//如果getParent()方法的返回值非空則不是根執行緒組
			if(rootGroup.getParent()!=null){
				//獲得父執行緒組
				rootGroup=rootGroup.getParent();
			}else{
				//如果到達根執行緒組則退出迴圈
				break;
			}
		}
		//返回根執行緒組
		return rootGroup;
	}
	
	/**
	 * 獲得給定執行緒組中所有執行緒名
	 * @param group
	 * @return
	 */
	public static List<String> getThreads(ThreadGroup group){
		//建立儲存執行緒名的列表
		List<String> threadList=new ArrayList<String>();
		//根據活動執行緒數建立執行緒陣列
		Thread[] threads=new Thread[group.activeCount()];
		//複製執行緒到執行緒陣列
		int count=group.enumerate(threads,false);
			//遍歷執行緒陣列將執行緒名及其所在組儲存到列表中
			for(int i=0;i<count;i++){
				threadList.add(group.getName()+"執行緒組:"+threads[i].getName());
			}
			//返回列表
			return threadList;
		
	} 
	/**
	 * 獲得執行緒組中子執行緒組
	 * @param group
	 * @return
	 */
	public static List<String>getThreadGroups(ThreadGroup group){
		//獲得給定執行緒組中執行緒名
		List<String> threadList=getThreads(group);
		//建立執行緒組陣列
		ThreadGroup[] groups=new ThreadGroup[group.activeGroupCount()];
		//複製子執行緒組到執行緒組資料
		int count=group.enumerate(groups,false);
		//遍歷所有子執行緒組
		for(int i=0;i<count;i++){
			//利用getThreads()方法獲得執行緒名列表
			threadList.addAll(getThreads(groups[i]));
		}
		//返回所有執行緒名
		return threadList;
	}
	
	public static void main(String[] args) throws InterruptedException {
		for(String string:getThreadGroups(getRootThreadGroups())){
			//遍歷輸出列表中的字串
			System.out.println(string);
		}
	}

結果: