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