Получите список всех потоков, в настоящее время работающих в Java

Когда использование Bash просто пробует это:

$ export JAVA_HOME=/usr/tomcat/jre
221
задан Matthias Braun 28 April 2019 в 22:41
поделиться

7 ответов

Чтобы получить итеративный набор:

Set<Thread> threadSet = Thread.getAllStackTraces().keySet();
299
ответ дан 23 November 2019 в 04:05
поделиться

Получите дескриптор корневой 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 (), пока массив не станет достаточно большим, чтобы содержать все записи.

71
ответ дан 23 November 2019 в 04:05
поделиться

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

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

kill -3 processid

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

28
ответ дан 23 November 2019 в 04:05
поделиться

Вы смотрели jconsole ?

Здесь перечислены все потоки, выполняющиеся для конкретного процесса Java.

Вы можете запустить jconsole из корзины JDK папку.

Вы также можете получить полную трассировку стека для всех потоков, нажав Ctrl + Break в Windows или отправив kill pid --QUIT в Linux.

14
ответ дан 23 November 2019 в 04:05
поделиться

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

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

18
ответ дан 23 November 2019 в 04:05
поделиться
    public static void main(String[] args) {


        // Walk up all the way to the root thread group
        ThreadGroup rootGroup = Thread.currentThread().getThreadGroup();
        ThreadGroup parent;
        while ((parent = rootGroup.getParent()) != null) {
            rootGroup = parent;
        }

        listThreads(rootGroup, "");
    }


    // List all threads and recursively list all subgroup
    public static void listThreads(ThreadGroup group, String indent) {
        System.out.println(indent + "Group[" + group.getName() + 
                ":" + group.getClass()+"]");
        int nt = group.activeCount();
        Thread[] threads = new Thread[nt*2 + 10]; //nt is not accurate
        nt = group.enumerate(threads, false);

        // List every thread in the group
        for (int i=0; i<nt; i++) {
            Thread t = threads[i];
            System.out.println(indent + "  Thread[" + t.getName() 
                    + ":" + t.getClass() + "]");
        }

        // Recursively list all subgroups
        int ng = group.activeGroupCount();
        ThreadGroup[] groups = new ThreadGroup[ng*2 + 10];
        ng = group.enumerate(groups, false);

        for (int i=0; i<ng; i++) {
            listThreads(groups[i], indent + "  ");
        }
    }
3
ответ дан 23 November 2019 в 04:05
поделиться

В консоли java нажмите Ctrl-Break . Он перечислит все потоки и некоторую информацию о куче. Конечно, это не даст вам доступа к объектам. Но в любом случае это может быть очень полезно для отладки.

3
ответ дан 23 November 2019 в 04:05
поделиться
Другие вопросы по тегам:

Похожие вопросы: