답변:
반복 가능한 세트를 얻으려면 :
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 ()를 반복적으로 호출하는 방법에 유의하십시오.
rootGroup
을 사용해야합니다 new Thread[rootGroup.activeCount()+1]
. activeCount()
0이면 무한 루프에 빠질 것입니다.
예, 스레드 목록을 확인하십시오 . 해당 페이지에 많은 예제가 있습니다.
프로그래밍 방식으로 수행해야합니다. 적어도 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());
}
Groovy 에서는 개인 메소드를 호출 할 수 있습니다
// 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
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 + " ");
}
}
터미널을 사용하여 스레드 및 전체 상태 목록을 얻으려면 아래 명령을 사용할 수 있습니다.
jstack -l <PID>
어떤 PID는 컴퓨터에서 실행중인 프로세스의 ID입니다. Java 프로세스의 프로세스 ID를 얻으려면 jps
명령을 실행하면 됩니다.
또한 fastthread 또는 spotify thread analyzer 도구 와 같은 TDA (Thread Dump Analyzer)에서 jstack에 의해 생성 된 스레드 덤프를 분석 할 수 있습니다 .