Thread.getAllStackTraces()方法

3,071 阅读1分钟

说明

Java多线程编程核心技术(第二版),章节:1.9。static Map<Thread, StackTraceElement[]> getAllStackTraces()方法的作用是返回所有活动线程的堆栈跟踪的一个映射。映射键是线程,而每个映射值都是一个StackTraceElement数组,该数组表示相应Thread的堆栈转储。返回的堆栈跟踪的格式都是针对getStackTrace方法指定的。在调用该方法的同时,线程可能也在执行。每个线程的堆栈跟踪仅代表一个快照,并且每个堆栈都可以在不同时间获得。如果虚拟机没有线程的堆栈跟踪信息,则映射值中将返回一个零长度数组。

demo代码

public class AllStackTraceElements {
    public void a() {
        b();
    }
    public void b() {
        c();
    }
    public void c() {
        d();
    }
    public void d() {
        e();
    }
    @SuppressWarnings({ "rawtypes", "static-access" })
    public void e() {
        Map<Thread, StackTraceElement[]> map = Thread.currentThread().getAllStackTraces();
        if (map != null && map.size() != 0) {
            Iterator it = map.keySet().iterator();
            while (it.hasNext()) {
                Thread t = (Thread) it.next();	
                StackTraceElement[] arr = map.get(t);
                System.out.println("-----------Thread信息----------------");
                System.out.println("Thread's name: " + t.getName());
                System.out.println("Thread's state: " + t.getState());
                System.out.println("Thread's StackTraceElement[] length: " + arr.length);
                System.out.println("-----------Thread信息----------------");
                if (arr.length > 0) {
                    for (int i = 0; i < arr.length; i++) {
                        StackTraceElement e = arr[i];
                        System.out.println("className:" + e.getClassName() + ",methodName:" +e.getMethodName()+ ",fileName:" + e.getFileName() + ",lineNumber:" + e.getLineNumber());
                    }
                } else {
                    System.out.println(" 没有 StackTraceElement[] 信息,,因为线程" + t.getName() + " StackTraceElement[] length = 0");
                }
                System.out.println();
            }
        }
    }
    public static void main(String[] args) {
        AllStackTraceElements test = new AllStackTraceElements();
        test.a();
    }
}

输出结果:

-----------Thread信息----------------
Thread's name: Finalizer
Thread's state: WAITING
Thread's StackTraceElement[] length: 4
-----------Thread信息----------------
className:java.lang.Object,methodName:wait,fileName:Object.java,lineNumber:-2
className:java.lang.ref.ReferenceQueue,methodName:remove,fileName:ReferenceQueue.java,lineNumber:144
className:java.lang.ref.ReferenceQueue,methodName:remove,fileName:ReferenceQueue.java,lineNumber:165
className:java.lang.ref.Finalizer$FinalizerThread,methodName:run,fileName:Finalizer.java,lineNumber:216

-----------Thread信息----------------
Thread's name: Attach Listener
Thread's state: RUNNABLE
Thread's StackTraceElement[] length: 0
-----------Thread信息----------------
 没有 StackTraceElement[] 信息,,因为线程Attach Listener StackTraceElement[] length = 0

-----------Thread信息----------------
Thread's name: Signal Dispatcher
Thread's state: RUNNABLE
Thread's StackTraceElement[] length: 0
-----------Thread信息----------------
 没有 StackTraceElement[] 信息,,因为线程Signal Dispatcher StackTraceElement[] length = 0

-----------Thread信息----------------
Thread's name: Reference Handler
Thread's state: WAITING
Thread's StackTraceElement[] length: 4
-----------Thread信息----------------
className:java.lang.Object,methodName:wait,fileName:Object.java,lineNumber:-2
className:java.lang.Object,methodName:wait,fileName:Object.java,lineNumber:502
className:java.lang.ref.Reference,methodName:tryHandlePending,fileName:Reference.java,lineNumber:191
className:java.lang.ref.Reference$ReferenceHandler,methodName:run,fileName:Reference.java,lineNumber:153

-----------Thread信息----------------
Thread's name: main
Thread's state: RUNNABLE
Thread's StackTraceElement[] length: 8
-----------Thread信息----------------
className:java.lang.Thread,methodName:dumpThreads,fileName:Thread.java,lineNumber:-2
className:java.lang.Thread,methodName:getAllStackTraces,fileName:Thread.java,lineNumber:1610
className:com.xxx.threadtest.allstacktraces.AllStackTraceElements,methodName:e,fileName:AllStackTraceElements.java,lineNumber:35
className:com.xxx.threadtest.allstacktraces.AllStackTraceElements,methodName:d,fileName:AllStackTraceElements.java,lineNumber:28
className:com.xxx.threadtest.allstacktraces.AllStackTraceElements,methodName:c,fileName:AllStackTraceElements.java,lineNumber:22
className:com.xxx.threadtest.allstacktraces.AllStackTraceElements,methodName:b,fileName:AllStackTraceElements.java,lineNumber:16
className:com.xxx.threadtest.allstacktraces.AllStackTraceElements,methodName:a,fileName:AllStackTraceElements.java,lineNumber:10
className:com.xxx.threadtest.allstacktraces.AllStackTraceElements,methodName:main,fileName:AllStackTraceElements.java,lineNumber:89