我正在寻找一种方法来查看当前正在运行的线程数
- 首先通过 Windows
- 以编程方式
这将为您提供 VM 中的线程总数:
int nbThreads = Thread.getAllStackTraces().keySet().size();
现在,如果您希望所有线程当前正在执行,您可以这样做:
int nbRunning = 0;
for (Thread t : Thread.getAllStackTraces().keySet()) {
if (t.getState()==Thread.State.RUNNABLE) nbRunning++;
}
此处列举了可能的状态:Thread.State javadoc
如果您想通过 Windows 工具而不是编程方式查看正在运行的线程,您可以使用Process Explorer。
您可以使用Thread.getAllStackTraces() 获取在 JVM 中运行的所有线程及其堆栈跟踪
回应您的以下评论
在以下代码中: while(resultSet.next()) { name=resultSet.getString("hName"); MyRunnable worker = new MyRunnable(hName); threadExecutor.execute(worker); } 。我的线程池大小为 10。我需要确保我的程序在多线程下正常工作,并且想要检查某个时刻有多少线程正在运行。我怎样才能做到这一点?
对于另一个答案,我建议您使用JVisualVM分析您的代码并检查您的线程池是否正常工作。这个建议背后的原因是,您不必为 JVM 管理的所有其他内务线程而烦恼。除了你想要做的是为什么像 JVisualVM 这样的工具是为之而生的。
如果您是分析 Java 程序的新手,JVisualVM 可以让您在运行代码时查看幕后发生的事情。您可以查看堆、GC 活动,检查运行/等待任何样本/配置您的 CPU 或内存使用情况的线程。还有不少插件。
从 Windows:
肯定有一个进程的性能计数器可以告诉你这一点。
以编程方式:
返回当前线程的线程组及其子组中活动线程数的估计值。递归迭代当前线程的线程组中的所有子组。
或者更直接地说,ThreadGroup#activeCount
:
返回此线程组及其子组中活动线程数的估计值。
返回此线程组的父级。
首先,如果parent不为null,则调用父线程组的checkAccess方法,不带参数;这可能会导致安全异常。
所有这些似乎都暗示了以下几点:
int activeThreadTotalEstimate() {
ThreadGroup group;
ThreadGroup parent;
group = Thread.currentThread().getThreadGroup();
while ((parent = group.getParent()) != null) {
group = parent;
}
return group.activeCount();
}
代码片段:
import java.util.Set;
import java.lang.Thread.State;
public class ActiveThreads {
public static void main(String args[]) throws Exception{
for ( int i=0; i< 5; i++){
Thread t = new Thread(new MyThread());
t.setName("MyThread:"+i);
t.start();
}
int threadCount = 0;
Set<Thread> threadSet = Thread.getAllStackTraces().keySet();
for ( Thread t : threadSet){
if ( t.getThreadGroup() == Thread.currentThread().getThreadGroup() &&
t.getState() == Thread.State.RUNNABLE){
System.out.println("Thread :"+t+":"+"state:"+t.getState());
++threadCount;
}
}
System.out.println("Thread count started by Main thread:"+threadCount);
}
}
class MyThread implements Runnable{
public void run(){
try{
Thread.sleep(2000);
}catch(Exception err){
err.printStackTrace();
}
}
}
输出:
Thread :Thread[main,5,main]:state:RUNNABLE
Thread count started by Main thread:1
解释:
Thread.getAllStackTraces().keySet()
为您提供所有线程的列表,这些线程已由两者启动Program and System
。在没有ThreadeGroup
条件的情况下,如果它们处于活动状态,您将获得系统线程数。
Reference Handler, Signal Dispatcher,Attach Listener and Finalizer