购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

1.9 static Map<Thread,StackTraceElement[]>getAllStackTraces()方法

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

创建测试用的代码如下:

package test8;

import java.util.Iterator;
import java.util.Map;

public class Test1 {

    public void a() {
        b();
    }

    public void b() {
        c();
    }

    public void c() {
        d();
    }

    public void d() {
        e();
    }

    public void e() {
        Map<Thread, StackTraceElement[]> map = 
            Thread.currentThread().getAllStackTraces();
        if (map != null && map.size() != 0) {
            Iterator keyIterator = map.keySet().iterator();
            while (keyIterator.hasNext()) {
                Thread eachThread = (Thread) keyIterator.next();
                StackTraceElement[] array = map.get(eachThread);
                System.out.println("------每个线程的基本信息");
                System.out.println("  线程名称:" + eachThread.getName());
                System.out.println(" StackTraceElement[].length=" + array.length);
                System.out.println("  线程的状态:" + eachThread.getState());
                if (array.length != 0) {
                    System.out.println(" 输出StackTraceElement[]数组具体信息:");
                    for (int i = 0; i < array.length; i++) {
                        StackTraceElement eachElement = array[i];
                        System.out.println("    " + eachElement.getClassName() + " " + eachElement.getMethodName() + " "+ eachElement.getFileName() + " " + eachElement.getLineNumber());
                    }
                } else {
                    System.out.println("  没有StackTraceElement[]信息,因为线程" + eachThread.getName() + "中的StackTraceElement[].length==0");
                }
                System.out.println();
                System.out.println();
            }
        }
    }

    public static void main(String[] args) {
        Test1 test1 = new Test1();
        test1.a();
    }
}

程序运行结果如下: qOpLbvwfN4Ptyi+iqF0EYVKup2HdcU2ih4W4iys3MMd8yvVIhUFCTofZh+z6OUpy

------每个线程的基本信息
    线程名称:Signal Dispatcher
StackTraceElement[].length=0
    线程的状态:RUNNABLE
    没有StackTraceElement[]信息,因为线程Signal Dispatcher中的StackTraceElement[].length==0

------每个线程的基本信息
    线程名称:main
StackTraceElement[].length=8
    线程的状态:RUNNABLE
    输出StackTraceElement[]数组具体信息:
        java.lang.Thread dumpThreads Thread.java -2
        java.lang.Thread getAllStackTraces Thread.java 1610
        test8.Test1 e Test1.java 25
        test8.Test1 d Test1.java 21
        test8.Test1 c Test1.java 17
        test8.Test1 b Test1.java 13
        test8.Test1 a Test1.java 9
        test8.Test1 main Test1.java 54

------每个线程的基本信息
    线程名称:Attach Listener
StackTraceElement[].length=0
    线程的状态:RUNNABLE
    没有StackTraceElement[]信息,因为线程Attach Listener中的StackTraceElement[].length==0

------每个线程的基本信息
    线程名称:Finalizer
StackTraceElement[].length=4
    线程的状态:WAITING
    输出StackTraceElement[]数组具体信息:
        java.lang.Object wait Object.java -2
        java.lang.ref.ReferenceQueue remove ReferenceQueue.java 143
        java.lang.ref.ReferenceQueue remove ReferenceQueue.java 164
        java.lang.ref.Finalizer$FinalizerThread run Finalizer.java 209


------每个线程的基本信息
    线程名称:Reference Handler
StackTraceElement[].length=4
    线程的状态:WAITING
    输出StackTraceElement[]数组具体信息:
        java.lang.Object wait Object.java -2
        java.lang.Object wait Object.java 502
        java.lang.ref.Reference tryHandlePending Reference.java 191
        java.lang.ref.Reference$ReferenceHandler run Reference.java 153
点击中间区域
呼出菜单
上一章
目录
下一章
×