我一直在寻找一种解决方案来获取程序中运行的线程数量。 我最终得到了来自Get a List of all Threads currently running in Java的两个解决方案。
使用
Set<Thread> threadSet = Thread.getAllStackTraces().keySet();
runningThreads = threadSet.size();
我最终得到 75 个帖子。
使用
ThreadGroup rootGroup = Thread.currentThread( ).getThreadGroup( );
ThreadGroup parentGroup;
while ( ( parentGroup = rootGroup.getParent() ) != null ) {
rootGroup = parentGroup;
}
Thread[] threads = new Thread[ rootGroup.activeCount() ];
while ( rootGroup.enumerate( threads, true ) == threads.length ) {
threads = new Thread[ threads.length * 2 ];
}
runningThreads = threads.length;
我最终获得了确切的双倍线程 - &gt; 150
我想知道为什么theads加倍并且看到了threads = new Thread[ threads.length * 2 ];
。
为什么我们在这个方法中乘以2?
编辑:
也许我的问题格格不入。即使现在回答我也想纠正它。
问题是为什么我们乘以2,即使大小已经足够大,因此得到错误数量的当前运行的线程。
答案 0 :(得分:2)
根据documentation of ThreadGroup,方法
public int enumerate(Thread[] list,
boolean recurse)
将以递归方式枚举子组。但是,它只返回可以在list
参数中填充的多个线程。因此,如果代码在length
中注意到您已经收到了list
个元素,并且假设有更多的线程需要枚举但数组大小不足,则代码会尝试分配更多的大小。 / p>
因此,当循环终止时,即使length
中有list
个元素,最后几个元素也将为null,并且在确定线程数时必须忽略它们