Получить список всех потоков, запущенных в данный момент в Java
Могу ли я каким-либо образом получить список всех запущенных потоков в текущей JVM (включая потоки, не запущенные моим классом)?
Возможно ли также получить объекты Thread и Class всех потоков в списке?
Thread
Class
Я хочу иметь возможность делать это с помощью кода.
Переведено автоматически
Ответ 1
Чтобы получить повторяющийся набор:
Set<Thread> threadSet = Thread.getAllStackTraces().keySet();
Производительность: 0 мс для 12 потоков (Azul JVM 16.0.1, Windows 10, Ryzen 5600X).
Ответ 2
Получить дескриптор корневого файла ThreadGroup, вот так:
ThreadGroup
ThreadGroup rootGroup = Thread.currentThread().getThreadGroup();ThreadGroup parentGroup;while ((parentGroup = rootGroup.getParent()) != null) { rootGroup = parentGroup;}
Теперь повторно вызовите функцию enumerate() в корневой группе. Второй аргумент позволяет рекурсивно получить все потоки.:
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.