[java] 현재 Java로 실행중인 모든 스레드 목록을 가져옵니다.

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

목록에서 모든 스레드 의 ThreadClass객체 를 가져올 수도 있습니까?

코드를 통해이 작업을 수행 할 수 있기를 원합니다.



답변

반복 가능한 세트를 얻으려면 :

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


답변

다음 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 에서 스레드에 대한 많은 정보를 얻을 수 있습니다 .

정적 ManagementFactory.getThreadMXBean () 메소드를 호출하여 MBean에 대한 참조를 가져 오십시오.


답변

jconsole을 살펴 보셨습니까 ?

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

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

Ctrl+BreakWindows에서 충돌 하거나 kill pid --QUITLinux에서 전송 하여 모든 스레드에 대한 전체 스택 추적을 얻을 수도 있습니다 .


답변

Apache Commons 사용자는을 사용할 수 있습니다 ThreadUtils. 현재 구현에서는 이전에 설명한 스레드 그룹 접근 방식을 사용합니다.

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


답변

다음과 같이 시도해보십시오.

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

필요한 경우 더 많은 스레드 특성을 얻을 수 있습니다.