sourcecode

Java에서 현재 실행 중인 모든 스레드 목록 가져오기

copyscript 2022. 12. 26. 20:31
반응형

Java에서 현재 실행 중인 모든 스레드 목록 가져오기

현재 JVM에서 실행 중인 모든 스레드 목록(클래스에서 시작하지 않은 스레드 포함)을 가져올 수 있는 방법이 있습니까?

또한, 이 정보를 입수할 수 있습니까?Thread그리고.Class목록 내 모든 스레드의 객체

나는 이것을 코드로 할 수 있게 되고 싶다.

반복 가능한 세트를 가져오려면:

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

퍼포먼스: 12 스레드에 0밀리초 (Azul JVM 16.0.1, Windows 10, Ryzen 5600X)

루트를 파악하다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()를 반복 호출하는 방법에 유의하십시오.

, 스레드 목록을 확인합니다.그 페이지에는 많은 예가 있습니다.

프로그래밍 방식으로 하는 것입니다.Linux 의 리스트만 필요한 경우는, 다음의 커맨드를 사용할 수 있습니다.

kill -3 processid

그러면 VM은 스레드 덤프를 실행하여 stdout을 수행합니다.

스레드에 대한 많은 정보를 ThreadMXBean에서 얻을 수 있습니다.

스태틱 Management Factory.get을 호출합니다.MBean에 대한 참조를 가져오는 ThreadMXBean() 메서드.

jconsole 보셨어요?

특정 Java 프로세스에 대해 실행 중인 모든 스레드가 나열됩니다.

JDK bin 폴더에서 jconsole을 시작할 수 있습니다.

또한 모든 스레드에 대한 전체 스택 트레이스를 얻으려면Ctrl+BreakWindows 또는 송신에 의해kill pid --QUITLinux 의 경우.

다음과 같은 작업을 수행할 수 있습니다.

Thread.getAllStackTraces().keySet().forEach((t) -> System.out.println(t.getName() + "\nIs Daemon " + t.isDaemon() + "\nIs Alive " + t.isAlive()));

필요에 따라 스레드 특성을 높일 수 있습니다.

Apache Commons 사용자는 를 사용할 수 있습니다.현재 구현에서는 앞서 설명한 워크 더 스레드 그룹 접근법을 사용합니다.

for (Thread t : ThreadUtils.getAllThreads()) {
      System.out.println(t.getName() + ", " + t.isDaemon());
}

그루비에서는 개인 메서드를 호출할 수 있습니다.

// Get a snapshot of the list of all threads 
Thread[] threads = Thread.getThreads()

Java에서는 보안 관리자가 허용하는 한 리플렉션 기능을 사용하여 이 메서드를 호출할 수 있습니다.

주 스레드로 시작하는 스레드 목록을 가져오는 코드 스니펫:

import java.util.Set;

public class ThreadSet {
    public static void main(String args[]) throws Exception{
        Thread.currentThread().setName("ThreadSet");
        for ( int i=0; i< 3; i++){
            Thread t = new Thread(new MyThread());
            t.setName("MyThread:"+i);
            t.start();
        }
        Set<Thread> threadSet = Thread.getAllStackTraces().keySet();
        for ( Thread t : threadSet){
            if ( t.getThreadGroup() == Thread.currentThread().getThreadGroup()){
                System.out.println("Thread :"+t+":"+"state:"+t.getState());
            }
        }
    }
}

class MyThread implements Runnable{
    public void run(){
        try{
            Thread.sleep(5000);
        }catch(Exception err){
            err.printStackTrace();
        }
    }
}

출력:

Thread :Thread[MyThread:2,5,main]:state:TIMED_WAITING
Thread :Thread[MyThread:0,5,main]:state:TIMED_WAITING
Thread :Thread[MyThread:1,5,main]:state:TIMED_WAITING
Thread :Thread[ThreadSet,5,main]:state:RUNNABLE

사용의 프로그램으로 기동하지 않은 시스템 스레드를 포함한 모든 스레드가 필요한 경우는, 다음의 조건을 삭제합니다.

if ( t.getThreadGroup() == Thread.currentThread().getThreadGroup())

현재 출력:

Thread :Thread[MyThread:2,5,main]:state:TIMED_WAITING
Thread :Thread[Reference Handler,10,system]:state:WAITING
Thread :Thread[MyThread:1,5,main]:state:TIMED_WAITING
Thread :Thread[ThreadSet,5,main]:state:RUNNABLE
Thread :Thread[MyThread:0,5,main]:state:TIMED_WAITING
Thread :Thread[Finalizer,8,system]:state:WAITING
Thread :Thread[Signal Dispatcher,9,system]:state:RUNNABLE
Thread :Thread[Attach Listener,5,system]:state:RUNNABLE

단말기를 사용하여 스레드 및 스레드의 전체 상태 목록을 가져오려면 다음 명령을 사용합니다.

jstack -l <PID>

어떤.<PID>는 컴퓨터에서 실행 중인 프로세스의 ID입니다.java 프로세스의 프로세스 ID를 취득하려면 , 다음의 순서를 실행합니다.jps명령어를 입력합니다.

또한 Jstack에서 생성된 스레드 덤프를 TDA(Thread Dump Analyzer)에서 고속 스레드 또는 스팟화 스레드 분석 도구로 분석할 수 있습니다.

Java 콘솔에서 Ctrl+Break 키를 누릅니다.모든 스레드와 힙에 대한 몇 가지 정보가 나열됩니다.물론 이렇게 하면 객체에 접근할 수 없습니다.그러나 디버깅에는 매우 도움이 됩니다.

    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 + "  ");
        }
    }

모든 라이브 스레드 ID를 반환하는 getAllThreadIds를 사용할 수 있습니다.반환된 배열에 포함된 일부 스레드는 이 메서드가 반환될 때 종료되었을 수 있습니다.

ManagementFactory.getThreadMXBean().getAllThreadIds()

언급URL : https://stackoverflow.com/questions/1323408/get-a-list-of-all-threads-currently-running-in-java

반응형