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

时间:2009-12-17 14:57:42

标签: java multithreading

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

10 个答案:

答案 0 :(得分:80)

java.lang.Thread.activeCount()

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

docs:http://docs.oracle.com/javase/7/docs/api/java/lang/Thread.html#activeCount()

答案 1 :(得分:66)

ManagementFactory.getThreadMXBean().getThreadCount()不会将自己限制为Thread.activeCount()的线程组。

答案 2 :(得分:47)

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

jconsole <process-id>

答案 3 :(得分:18)

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

Thread.activeCount()

  

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

此外,如果您希望实时监控它们,外部调试器应列出所有活动线程(并允许您暂停任意数量的线程)。

答案 4 :(得分:7)

我编写了一个程序,用于迭代所有Threads创建并打印getState()

Thread
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();
        }
    }
}

输出:

java ThreadStatus

Thread :Thread[MyThread:0,5,main]:state:TIMED_WAITING
Thread :Thread[main,5,main]:state:RUNNABLE
Thread :Thread[MyThread:1,5,main]:state:TIMED_WAITING
Thread :Thread[MyThread:4,5,main]:state:TIMED_WAITING
Thread :Thread[MyThread:2,5,main]:state:TIMED_WAITING
Thread :Thread[MyThread:3,5,main]:state:TIMED_WAITING
Thread count started by Main thread:6

如果删除以下条件

if ( t.getThreadGroup() == Thread.currentThread().getThreadGroup())

您也将获得输出中的线程,这些线程已由系统启动。

Reference Handler, Signal Dispatcher,Attach Listener and Finalizer

答案 5 :(得分:6)

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

ps -o nlwp <pid>

答案 6 :(得分:4)

使用Linux Top命令

top -H -p (process id)

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

ps aux | grep (your program name)

例如:

ps aux | grep user.py

答案 7 :(得分:2)

    public class MainClass {

        public static void main(String args[]) {

          Thread t = Thread.currentThread();
          t.setName("My Thread");

          t.setPriority(1);

          System.out.println("current thread: " + t);

          int active = Thread.activeCount();
          System.out.println("currently active threads: " + active);
          Thread all[] = new Thread[active];
          Thread.enumerate(all);

          for (int i = 0; i < active; i++) {
             System.out.println(i + ": " + all[i]);
          }
       }
   }

答案 8 :(得分:0)

使用jstack获取线程数

jstack <PID> | grep 'java.lang.Thread.State' | wc -l

以上代码的结果与top -H -p <PID>ps -o nlwp <PID>完全不同,因为jstack仅从应用程序创建的线程中获取线程。

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

答案 9 :(得分:0)

$ ps -p <pid> -lfT | wc -l

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

$ top 要么 $ ps aux | grep (your program name)

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

$ ps -elfT | wc -l

这是针对 centOS / Red Hat 机器的,它可能在其他 linux 机器上工作,也可能不工作