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

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

  • Через Windows сначала
  • Программным

Ответ 1

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

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.

Ответ 2

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

Ответ 3

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

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

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

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

Ответ 4

Из Windows:

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

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

Там Thread#activeCount:

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

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

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

и ThreadGroup#getParent:

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

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

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

int activeThreadTotalEstimate() {
    ThreadGroup group;
    ThreadGroup parent;

    group = Thread.currentThread().getThreadGroup();
    while ((parent = group.getParent()) != null) {
        group = parent;
    }
    return group.activeCount();
}

Ответ 5

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

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