java 获取当前所有线程的两种方法 group和map

本文介绍了两种在Java中获取当前所有线程的方法。一种是通过遍历线程组并获取线程信息,另一种则是直接使用Thread类的静态方法getAllStackTraces来获取所有活动线程的堆栈跟踪。

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

import java.util.Iterator;
import java.util.Map;

/*
 * 获取当前所有线程 的两种方法
 * (线程1因为 已经早早执行结束,所以下面获取的时候没有了)
 * (线程2在延时中,所以能获取到)
 * 
 */

public class Runthread {
	public static void main(String[] args) {


		//线程1
		new Thread(){
			@Override
			public void run() {
				System.out.println("这是线程1的run1111111111");
			}
		}.start();


		//线程2
		new Thread(){
			@Override
			public void run() {
				try {
					Thread.sleep(2000);
				} catch (InterruptedException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
				System.out.println("这是线程2的run222222222");
			}
		}.start();

		//获取当前所有线程 堆栈
		System.err.println("方法111-------------------");

		ThreadGroup group = Thread.currentThread().getThreadGroup();  
		ThreadGroup topGroup = group;  
		//遍历线程组树,获取根线程组  ( 加上这段那么与方法2效果一样)
//		while (group != null) {  
//			topGroup = group;  
//			group = group.getParent();  
//		}  
		//激活的线程数加倍  
		int estimatedSize = topGroup.activeCount() * 2;  
		Thread[] slackList = new Thread[estimatedSize];  
		// 获取根线程组的所有线程  
		int actualSize = topGroup.enumerate(slackList);  
		// copy into a list that is the exact size  
		Thread[] list = new Thread[actualSize];  
		System.arraycopy(slackList, 0, list, 0, actualSize);  
		System.out.println("当前线程数: " + list.length);  
		for (Thread thread : list) {  
			System.out.println(thread.getName());  
		}  


		System.err.println("方法22-----------------------------");

		Map map=Thread.getAllStackTraces(); //也可以map<Thread, StackTraceElement[]>
		System.out.println("当前线程数:"+map.size());
		Iterator it=map.keySet().iterator();
		while (it.hasNext()) {
			Thread t=(Thread) it.next(); //
			System.out.println(t.getName());
		}

		System.err.println("-----------------------------");
	}


}




转:

http://www.asni.cn/ZhiYan/archives/384.html  java常用对象Map集合中关于取出元素的说明

http://blog.youkuaiyun.com/daditao/article/details/19811669  获取 Java VM 中当前运行的所有线程

http://zhidao.baidu.com/link?url=RzmIMVXL7bWmSGQxFtVPzgT2VXQIxrCB5hTovZ77rNst9_u2CbFbxRjQWrehDYuYM-8Ck7uYaJH6h2TQTzRx1q

百度知道解释。很多方法。


sxd901026  | 五级
Map map=Thread.getAllStackTraces();
System.out.println(map.size());
把这两句话放在需要的方法里里,运行就可以得到结果了。
下面这句话是java api的解释:
Thread类。
getAllStackTracespublic static Map<Thread,StackTraceElement[]> getAllStackTraces()返回所有活动线程的堆栈跟踪的一个映射。映射键是线程,而每个映射值都是一个 StackTraceElement 数组,该数组表示相应 Thread 的堆栈转储。返回的堆栈跟踪的格式都是针对 getStackTrace 方法指定的。
在调用该方法的同时,线程可能也在执行。每个线程的堆栈跟踪仅代表一个快照,并且每个堆栈跟踪都可以在不同时间获得。如果虚拟机没有线程的堆栈跟踪信息,则映射值中将返回一个零长度数组。
如果有安全管理器,则通过 RuntimePermission("getStackTrace") 权限和 RuntimePermission("modifyThreadGroup") 权限调用其 checkPermission 方法,查看是否可以获得所有线程的堆栈跟踪。
收起
评论  |  0  1
2013-02-22 16:19 saintljf  | 二级
System.out.println(Thread.currentThread().getThreadGroup().activeCount());
这段代码放到任意属于线程池的线程方法里,运行得到结果
评论(1)  4  1
2015-07-07 09:38 幸福专卖店8888  | 九级
System.out.println(Thread.getAllStackTraces().size());


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值