Как я могу увидеть количество потоков в процессе Java?
Как получить количество потоков в Java-процессе
Ответ 1
Полезный инструмент для отладки java-программ, он дает количество потоков и другую соответствующую информацию на них:
jconsole <process-id>
Ответ 2
java.lang.Thread.activeCount()
Он вернет количество активных потоков в текущей группе потоков.
docs: http://docs.oracle.com/javase/7/docs/api/java/lang/Thread.html#activeCount()
Ответ 3
ManagementFactory.getThreadMXBean().getThreadCount()
не ограничивает себя группами потоков, как это делает Thread.activeCount()
.
Ответ 4
В классе Thread
есть статический метод, который будет возвращать количество активных потоков, управляемых JVM:
Thread.activeCount()
Возвращает количество активных потоков в текущей группе потоков потоков.
Кроме того, внешние отладчики должны отображать все активные потоки (и позволяют вам приостановить их количество), если вы хотите контролировать их в режиме реального времени.
Ответ 5
Я написал программу для итерации всех 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
.
Ответ 6
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]);
}
}
}
Ответ 7
Общее решение, для которого не требуется GUI, например jconsole (не работает на удаленных терминалах), ps работает для процессов, отличных от java, не требует установки JVM.
ps -o nlwp <pid>
Ответ 8
Использование команды Linux Top
top -H -p (process id)
вы можете получить идентификатор процесса одной программы с помощью этого метода:
ps aux | grep (your program name)
например:
ps aux | grep user.py