Как получить количество потоков в процессе Java


Как я могу увидеть количество потоков в процессе Java?

8 61

8 ответов:

полезный инструмент для отладки java-программ, он дает количество потоков и другую соответствующую информацию о них:

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()

возвращает количество активных потоков в группе потоков текущего потока.

Я написал программу для перебора всех 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.

универсальное решение, которое не требует графического интерфейса, такого как jconsole (не работает на удаленных терминалах), ps работает для процессов, отличных от java, не требует установки JVM.

ps -o nlwp <pid>

Использование Linux Top команда

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]);
          }
       }
   }