현재 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()));

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