我想知道特定Thread类有多少活动线程。
可以说我有一个T类扩展线程。在其他一些类(Ex:Demo)中,我想得到T类Thread的线程数。我知道Thread.activeCount()
方法,但它会得到一个线程组的计数。它不能满足我的需求。假设我有T1和T2类扩展线程,在Demo类中我想得到多少T2活动线程。
我该怎么做到这一点?任何想法??
PS:我没有T1级和T2级的源代码。
感谢您的帮助。
答案 0 :(得分:1)
您可以使用Thread.enumerate()
:
public int countThreadsOfClass(Class<? extends Thread> clazz) {
Thread[] tarray = new Thread[Thread.activeCount()];
Thread.enumerate(tarray);
int count = 0;
for(Thread t : tarray) {
if(clazz.isInstance(t))
count++;
}
return count;
}
答案 1 :(得分:0)
您的put
(或Thread
)子类可以保持Runnable
个有效计数。 static
开始时递增,run()
结束时递减(在run()
块中)。
确保增量/减量以多线程安全方式完成。
答案 2 :(得分:0)
您可以实现ThreadFactory来构造自定义Thread类并提供一个ThreadGroup实例来获取计数。通过使用ThreadFactory,每个实例都可以包含自己的ThreadGroup,根据所使用的工厂进行计数。
答案 3 :(得分:0)
尝试使用ThreadPoolExecutor
。
您可以扩展ThreadPoolExecutor
并通过调用getActiveCount()
来计算线程数。
http://docs.oracle.com/javase/6/docs/api/java/util/concurrent/ThreadPoolExecutor.html
答案 4 :(得分:0)
private static int getThreadCount(){
int runningThread = 0;
for (Thread t : Thread.getAllStackTraces().keySet()) if (t.getState()==Thread.State.RUNNABLE && t instanceof YourThreadClassName ) runningThread++;
System.out.println("Active threads : "+runningThread);
return runningThread;
}
将 YourThreadClassName 替换为由Thread扩展的类。