说明
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