如何获得Java进程中的线程数量
我怎样才能看到一个Java进程中的线程数量?
有用的debuggingJava程序的工具,它给出了线程的数量和其他相关的信息:
jconsole <process-id>
java.lang.Thread.activeCount()
它将返回当前线程线程组中活动线程的数量。
docs: http : //docs.oracle.com/javase/7/docs/api/java/lang/Thread.html#activeCount()
ManagementFactory.getThreadMXBean().getThreadCount()
不会像Thread.activeCount()
那样将自身限制为线程组。
Thread
类上有一个静态方法,它将返回由JVM控制的活动线程的数量:
Thread.activeCount()
返回当前线程线程组中活动线程的数量。
此外,如果您希望实时监控它们,则外部debugging器应列出所有活动的线程(并允许您暂停其中任意数量的线程)。
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]); } } }
我写了一个程序来迭代所有创build的Threads
,并打印每个Thread
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(); } } }
输出:
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
。
通用的解决scheme,不需要像jconsole一样的GUI(不能在远程terminal上工作),ps适用于非java进程,不需要安装JVM。
ps -o nlwp <pid>
使用Linux Top命令
top -H -p (process id)
你可以通过这个方法获得一个程序的进程ID:
ps aux | grep (your program name)
例如 :
ps aux | grep user.py