当前运行的线程列表

时间:2013-07-09 13:47:05

标签: java multithreading jvm

我一直在寻找一种解决方案来获取程序中运行的线程数量。 我最终得到了来自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,即使大小已经足够大,因此得到错误数量的当前运行的线程。

1 个答案:

答案 0 :(得分:2)

根据documentation of ThreadGroup,方法

public int enumerate(Thread[] list,
            boolean recurse)

将以递归方式枚举子组。但是,它只返回可以在list参数中填充的多个线程。因此,如果代码在length中注意到您已经收到了list个元素,并且假设有更多的线程需要枚举但数组大小不足,则代码会尝试分配更多的大小。 / p>

因此,当循环终止时,即使length中有list个元素,最后几个元素也将为null,并且在确定线程数时必须忽略它们