Как проверить количество запущенных потоков в Java?

Я ищу способ увидеть количество запущенных потоков

  1. Сначала через винду
  2. Программный

5 ответов

Решение

Это даст вам общее количество потоков в вашей виртуальной машине:

int nbThreads =  Thread.getAllStackTraces().keySet().size();

Теперь, если вы хотите, чтобы все потоки выполнялись в данный момент, вы можете сделать это:

int nbRunning = 0;
for (Thread t : Thread.getAllStackTraces().keySet()) {
    if (t.getState()==Thread.State.RUNNABLE) nbRunning++;
}

Возможные состояния перечислены здесь: Thread.State javadoc

Если вы хотите видеть запущенные потоки не программно, а с помощью инструмента Windows, вы можете использовать Process Explorer.

Вы можете получить все потоки и их трассировки стека, запущенные в JVM, используя Thread.getAllStackTraces()

В ответ на ваш следующий комментарий

В следующем фрагменте кода: while(resultSet.next()) { name=resultSet.getString("hName"); MyRunnable worker = новый MyRunnable(hName); threadExecutor.execute(работник); } Мой пул потоков имеет размер 10. Мне нужно убедиться, что моя программа работает правильно с многопоточностью и хочу проверить, сколько потоков запущено в определенный момент. Как я могу это сделать?

на другой ответ, я предлагаю вам профилировать свой код с JVisualVM и проверить, работает ли ваш пул потоков, как следует. Причиной этого предложения является то, что вам не нужно беспокоиться обо всех других служебных потоках, которыми управляет JVM. Кроме того, что вы хотите сделать, это то, почему такие инструменты, как JVisualVM созданы для.

Если вы новичок в профилировании программ на Java, JVisualVM позволит вам увидеть, что происходит во время работы вашего кода. Вы можете увидеть активность кучи, GC, проверить потоки, работающие / ожидающие любой образец / профиль вашего процессора или использование памяти. Есть также несколько плагинов.

Фрагмент кода:

import java.util.Set;
import java.lang.Thread.State;
public class ActiveThreads {
    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() && 
                t.getState() == Thread.State.RUNNABLE){
                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();
        }
    }
}

выход:

Thread :Thread[main,5,main]:state:RUNNABLE
Thread count started by Main thread:1

Объяснение:

Thread.getAllStackTraces().keySet() предоставляет вам список всех потоков, которые были запущены обоими Program and System, В отсутствии ThreadeGroup условие, вы получите подсчет системных потоков, если они активны.

Reference Handler, Signal Dispatcher,Attach Listener and Finalizer

Из Windows:

Там обязательно должен быть счетчик производительности для процесса, который может вам это сказать.

Программный:

Там в Thread#activeCount:

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

Или более прямо, ThreadGroup#activeCount:

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

а также ThreadGroup#getParent:

Возвращает родителя этой группы потоков.

Во-первых, если родитель не нулевой, метод checkAccess родительской группы потоков вызывается без аргументов; это может привести к исключению безопасности.

Все из которых, кажется, предлагают что-то вроде:

int activeThreadTotalEstimate() {
    ThreadGroup group;
    ThreadGroup parent;

    group = Thread.currentThread().getThreadGroup();
    while ((parent = group.getParent()) != null) {
        group = parent;
    }
    return group.activeCount();
}
Другие вопросы по тегам