如何获取Java进程中的线程数

如何获取Java进程中的线程数,java,multithreading,Java,Multithreading,如何查看Java进程中的线程数 在Thread类上有一个静态方法,它将返回JVM控制的活动线程数: Thread.activeCount() 返回当前线程的线程组中的活动线程数 此外,如果您希望实时监视所有活动线程,则外部调试器应列出所有活动线程(并允许您挂起任意数量的线程) java.lang.Thread.activeCount() 它将返回当前线程的线程组中活动线程的数量 文档:是调试java程序的有用工具,它提供了线程数量和其他相关信息: jconsolepublic类MainClas

如何查看Java进程中的线程数

Thread
类上有一个静态方法,它将返回JVM控制的活动线程数:

Thread.activeCount()

返回当前线程的线程组中的活动线程数

此外,如果您希望实时监视所有活动线程,则外部调试器应列出所有活动线程(并允许您挂起任意数量的线程)

java.lang.Thread.activeCount()
它将返回当前线程的线程组中活动线程的数量


文档:

是调试java程序的有用工具,它提供了线程数量和其他相关信息:

jconsole

public类MainClass{
公共静态void main(字符串参数[]){
Thread t=Thread.currentThread();
t、 setName(“我的线程”);
t、 设置优先级(1);
System.out.println(“当前线程:+t”);
int active=Thread.activeCount();
System.out.println(“当前活动线程:“+active”);
线程全部[]=新线程[活动];
线程。枚举(全部);
for(int i=0;i
不像
thread.activeCount()
那样将自身局限于线程组。

我编写了一个程序来迭代创建的所有
线程,并打印每个
线程的
getState()

import java.util.Set;

public class ThreadStatus {
    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()){
                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();
        }
    }
}
如果您删除以下条件

if ( t.getThreadGroup() == Thread.currentThread().getThreadGroup())
您还将在输出中获得以下线程,这些线程已由系统启动


引用处理程序、信号分配器、附加侦听器和终结器

通用解决方案不需要像jconsole这样的GUI(在远程终端上不工作),ps适用于非java进程,不需要安装JVM


ps-o nlwp

使用Linux
Top
命令

top-H-p(进程id)

您可以通过以下方法获取一个程序的进程id:

ps aux|grep(您的程序名)

例如:


ps aux | grep user.py

使用jstack获取线程数

jstack <PID> | grep 'java.lang.Thread.State' | wc -l
jstack | grep'java.lang.Thread.State'| wc-l
上述代码的结果与
top-H-p
ps-o nlwp
非常不同,因为jstack只从应用程序创建的线程中获取线程

换句话说,jstack不会获得GC线程

$ps-p-lfT | wc-l

您可以使用以下方法获取pid:

$top
$ps aux | grep(您的程序名)

获取所有线程,而不仅仅是一个进程

$ps-elfT|wc-l


这是针对centOS/Red Hat机器的,它可能在其他linux机器上工作,也可能不工作。线程数量与我在
顶部看到的线程数量完全相同。尽管在调试窗口中,我只看到2个线程在运行,而不是5个线程:/管理工厂?在哪个包下?
导入java.lang.management.ManagementFactory
在您自己开始做之前,请参见
getPeakThreadCount()
和其他方法:)这只是一个估计值。
if ( t.getThreadGroup() == Thread.currentThread().getThreadGroup())
jstack <PID> | grep 'java.lang.Thread.State' | wc -l