Можно ли как-нибудь получить список всех запущенных потоков в текущей JVM (включая потоки, не запущенные моим классом)?
Можно ли также получить объекты Thread
и Class
всех потоков в списке?
Я хочу быть в состоянии сделать это с помощью кода.
java
multithreading
jvm
Kryten
источник
источник
Получить дескриптор к корню
ThreadGroup
, как это:Теперь
enumerate()
повторно вызовите функцию в корневой группе. Второй аргумент позволяет получить все потоки рекурсивно:Обратите внимание, как мы неоднократно вызываем enumerate (), пока массив не станет достаточно большим, чтобы содержать все записи.
источник
rootGroup
, вы должны использоватьnew Thread[rootGroup.activeCount()+1]
.activeCount()
может быть ноль, и если это так, вы столкнетесь с бесконечным циклом.Да, взгляните на получение списка тем . Много примеров на этой странице.
Это делается программно. Если вы просто хотите получить список в Linux, по крайней мере, вы можете просто использовать эту команду:
и виртуальная машина сделает дамп потока в стандартный вывод.
источник
Вы можете получить много информации о потоках из ThreadMXBean .
Вызовите статический метод ManagementFactory.getThreadMXBean (), чтобы получить ссылку на MBean.
источник
Вы смотрели на jconsole ?
Это перечислит все потоки, работающие для определенного процесса Java.
Вы можете запустить jconsole из папки bin JDK.
Вы также можете получить полную трассировку стека для всех потоков, нажав
Ctrl+Break
в Windows или отправивkill pid --QUIT
в Linux.источник
Пользователи Apache Commons могут использовать
ThreadUtils
. Текущая реализация использует ранее описанный подход с использованием групповых потоков.источник
Вы можете попробовать что-то вроде этого:
и вы можете, очевидно, получить больше характеристик потока, если вам нужно.
источник
В Groovy вы можете вызывать приватные методы
В Java вы можете вызывать этот метод, используя отражение, если это разрешено диспетчером безопасности.
источник
Фрагмент кода, чтобы получить список потоков, запущенных основным потоком:
вывод:
Если вам нужны все потоки, включая системные, которые не были запущены вашей программой, удалите условие ниже.
Теперь вывод:
источник
источник
В консоли Java нажмите Ctrl-Break . В нем будут перечислены все потоки плюс некоторая информация о куче. Это не даст вам доступ к объектам, конечно. Но это может быть очень полезно для отладки в любом случае.
источник
Чтобы получить список потоков и их полных состояний с помощью терминала, вы можете использовать команду ниже:
Какой PID является идентификатором процесса, запущенного на вашем компьютере. Чтобы получить идентификатор процесса вашего Java-процесса, вы можете просто запустить
jps
команду.Кроме того, вы можете проанализировать дамп потока, созданный jstack в TDA (Thread Dump Analyzer), с помощью такого инструмента быстрого анализа потока или спрайтов .
источник
ManagementFactory.getThreadMXBean().getAllThreadIds()
источник