Як отримати кількість потоків у процесі Java


Відповіді:


54

Корисний інструмент для налагодження програм Java, він надає кількість потоків та іншу відповідну інформацію про них:

jconsole <process-id>



79

ManagementFactory.getThreadMXBean().getThreadCount()не обмежується групами потоків, як Thread.activeCount()це робить.


+1 за це. Кількість ниток точно така ж, як я бачу на ній top. Хоча у вікні налагодження я бачу лише 2 потоки, що працюють замість 5.: /
Аруман

Управління фабрикою? під який пакет?
Мехер

import java.lang.management.ManagementFactory; docs.oracle.com/javase/8/docs/api/java/lang/management/... Також перегляньте getPeakThreadCount()та інші методи, перш ніж почати робити це самостійно :)
Крістоф Руссі,

24

Існує статичний метод для ThreadКласу, який повертає кількість активних потоків, керованих JVM:

Thread.activeCount()

Повертає кількість активних потоків у поточній групі потоків.

Крім того, зовнішні налагоджувачі повинні перерахувати всі активні потоки (і дозволити вам призупинити будь-яку їх кількість), якщо ви хочете відстежувати їх у режимі реального часу.


12

Загальне рішення, яке не потребує графічного інтерфейсу, такого як jconsole (не працює на віддалених терміналах), ps працює для процесів, що не виконуються Java, не вимагає встановленої JVM.

ps -o nlwp <pid>


9

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

За допомогою Topкоманди Linux

top -H -p (process id)

Ви можете отримати ідентифікатор процесу однієї програми цим методом:

ps aux | grep (your program name)

наприклад :

ps aux | grep user.py


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

0

Отримайте кількість потоків за допомогою jstack

jstack <PID> | grep 'java.lang.Thread.State' | wc -l

В результаті наведеної вище коди досить сильно відрізняються від top -H -p <PID>або ps -o nlwp <PID>тому , що jstack отримує тільки нитки зі створеного додатки.

Іншими словами, jstack не отримає потоки GC

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.