《Java多线程编程核心技术(第2版)》 —1.9 static Map<Thread, StackTraceElement

举报
华章计算机 发表于 2020/02/08 15:00:21 2020/02/08
【摘要】 本节书摘来自华章计算机《Java多线程编程核心技术(第2版)》 一书中第1章,第1.9节,作者是高洪岩。

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();

    }

}

程序运行结果如下:

------每个线程的基本信息

    线程名称: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


【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。