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+Break
Windows 또는 송신에 의해kill pid --QUIT
Linux 의 경우.
다음과 같은 작업을 수행할 수 있습니다.
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
'sourcecode' 카테고리의 다른 글
jsoup을 사용하여 html을 일반 텍스트로 변환할 때 줄 바꿈을 유지하는 방법은 무엇입니까? (0) | 2022.12.26 |
---|---|
phpMyAdmin 설치 - 오류 1045:접근 거부됨(사용: 비밀번호: NO) (0) | 2022.12.26 |
한 페이지에 여러 개의 리캡처를 표시하려면 어떻게 해야 하나요? (0) | 2022.12.26 |
mysql 테이블이 mysql을 사용하고 있는지 어떻게 알 수 있습니까?ISAM 또는 InnoDB 엔진 (0) | 2022.12.06 |
목록 요소의 가능한 모든 조합을 가져오려면 어떻게 해야 합니까? (0) | 2022.12.06 |