Я ищу способ увидеть количество текущих выполняемых потоков
- Через Windows сначала
- Программным
Я ищу способ увидеть количество текущих выполняемых потоков
Это даст вам общее количество потоков в вашей виртуальной машине:
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()) { Имя = resultSet.getString( "hName" ); MyRunnable worker = new MyRunnable (hName); threadExecutor.execute(рабочий); }. Моя тема пул имеет размер 10. Мне нужно убедиться, что моя программа работает правильно с многопоточными и хотите проверить, сколько потоков работает в определенный момент. Как я могу это сделать?
к другому ответу, я предлагаю вам профилировать свой код с помощью JVisualVM и проверить, работает ли ваш пул потоков так, как должен. Причина этого предположения заключается в том, что тогда вам не нужно беспокоиться обо всех других проблемах с домохозяйством, которыми управляет JVM. Кроме того, что вы хотите сделать, это то, для чего нужны инструменты, такие как JVisualVM.
Если вы новичок в профилировании Java-программ, JVisualVM позволяет вам видеть, что происходит под капотом, когда вы используете свой код. Вы можете увидеть активность кучи, GC, проверить потоки, выполняемые/ожидающие выборки/профиля, вашего процессора или использования памяти. Существует немало плагинов.
Из Windows:
Там должен быть счетчик производительности для процесса, который может вам это сказать.
Программный:
Там Thread#activeCount
:
Возвращает оценку количества активных потоков в текущей группе потоков потоков и ее подгруппах. Рекурсивно выполняет итерацию по всем подгруппам в текущей группе потоков потоков.
Или более прямо, ThreadGroup#activeCount
:
Возвращает оценку числа активных потоков в этой группе потоков и ее подгруппах.
Возвращает родительский элемент этой группы потоков.
Во-первых, если родительский элемент не равен null, метод checkAccess родительской группы потоков вызывается без аргументов; это может привести к исключению безопасности.
Все из них, кажется, предлагают что-то вроде:
int activeThreadTotalEstimate() {
ThreadGroup group;
ThreadGroup parent;
group = Thread.currentThread().getThreadGroup();
while ((parent = group.getParent()) != null) {
group = parent;
}
return group.activeCount();
}
Фрагмент кода:
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