《Java多线程编程核心技术(第2版)》 —1.9 static Map<Thread, StackTraceElement
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
- 点赞
- 收藏
- 关注作者
评论(0)