如何查看Java进程中的线程数?
答案 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 机器上工作,也可能不工作