Як я можу побачити кількість потоків у процесі Java?
Відповіді:
java.lang.Thread.activeCount()
Він поверне кількість активних потоків у поточній групі потоків .
документи: http://docs.oracle.com/javase/7/docs/api/java/lang/Thread.html#activeCount ()
ManagementFactory.getThreadMXBean().getThreadCount()
не обмежується групами потоків, як Thread.activeCount()
це робить.
top
. Хоча у вікні налагодження я бачу лише 2 потоки, що працюють замість 5.: /
import java.lang.management.ManagementFactory;
docs.oracle.com/javase/8/docs/api/java/lang/management/... Також перегляньте getPeakThreadCount()
та інші методи, перш ніж почати робити це самостійно :)
Існує статичний метод для Thread
Класу, який повертає кількість активних потоків, керованих JVM:
Thread.activeCount()
Повертає кількість активних потоків у поточній групі потоків.
Крім того, зовнішні налагоджувачі повинні перерахувати всі активні потоки (і дозволити вам призупинити будь-яку їх кількість), якщо ви хочете відстежувати їх у режимі реального часу.
Загальне рішення, яке не потребує графічного інтерфейсу, такого як jconsole (не працює на віддалених терміналах), ps працює для процесів, що не виконуються Java, не вимагає встановленої JVM.
ps -o nlwp <pid>
Я написав програму для повторення всього 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
.
За допомогою Top
команди Linux
top -H -p (process id)
Ви можете отримати ідентифікатор процесу однієї програми цим методом:
ps aux | grep (your program name)
наприклад :
ps aux | grep user.py
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]);
}
}
}
Отримайте кількість потоків за допомогою jstack
jstack <PID> | grep 'java.lang.Thread.State' | wc -l
В результаті наведеної вище коди досить сильно відрізняються від top -H -p <PID>
або ps -o nlwp <PID>
тому , що jstack отримує тільки нитки зі створеного додатки.
Іншими словами, jstack не отримає потоки GC