현재 JVM에서 실행중인 모든 스레드 목록을 얻을 수있는 방법이 있습니까 (클래스에서 시작 하지 않은 스레드 포함 )?
목록에서 모든 스레드 의 Thread
및 Class
객체 를 가져올 수도 있습니까?
코드를 통해이 작업을 수행 할 수 있기를 원합니다.
답변
반복 가능한 세트를 얻으려면 :
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+Break
Windows에서 충돌 하거나 kill pid --QUIT
Linux에서 전송 하여 모든 스레드에 대한 전체 스택 추적을 얻을 수도 있습니다 .
답변
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()));
필요한 경우 더 많은 스레드 특성을 얻을 수 있습니다.