Вопрос-ответ

Get a list of all threads currently running in Java

Получить список всех потоков, запущенных в данный момент в Java

Могу ли я каким-либо образом получить список всех запущенных потоков в текущей JVM (включая потоки, не запущенные моим классом)?

Возможно ли также получить объекты Thread и Class всех потоков в списке?

Я хочу иметь возможность делать это с помощью кода.

Переведено автоматически
Ответ 1

Чтобы получить повторяющийся набор:

Set<Thread> threadSet = Thread.getAllStackTraces().keySet();

Производительность: 0 мс для 12 потоков (Azul JVM 16.0.1, Windows 10, Ryzen 5600X).

Ответ 2

Получить дескриптор корневого файла ThreadGroup, вот так:

ThreadGroup rootGroup = Thread.currentThread().getThreadGroup();
ThreadGroup parentGroup;
while ((parentGroup = rootGroup.getParent()) != null) {
rootGroup = parentGroup;
}

Теперь повторно вызовите функцию enumerate() в корневой группе. Второй аргумент позволяет рекурсивно получить все потоки.:

Thread[] threads = new Thread[rootGroup.activeCount()];
while (rootGroup.enumerate(threads, true ) == threads.length) {
threads = new Thread[threads.length * 2];
}

Обратите внимание, как мы вызываем enumerate() несколько раз, пока массив не станет достаточно большим, чтобы вместить все записи.

Ответ 3

Да, взгляните на получение списка потоков. На этой странице много примеров.

Это делается программно. Если вам нужен просто список, по крайней мере, в Linux, вы можете просто использовать эту команду:

kill -3 processid

и виртуальная машина выполнит дамп потока в стандартный вывод.

Ответ 4

Вы можете получить много информации о потоках из ThreadMXBean.

Вызовите статический метод ManagementFactory.getThreadMXBean(), чтобы получить ссылку на MBean.

java multithreading jvm