打印堆栈

来源:互联网 发布:程序员 年薪 编辑:程序博客网 时间:2024/04/29 10:57

public class Trace{
 public static void main(String[] args){
  Thread[] list = Trace.findAllThreads();
  for(Thread thread: list){
   StackTraceElement[] trace = thread.getStackTrace();
      for(StackTraceElement tra:trace){
       System.out.println(tra.toString());
      }
     }
 }

 public static Thread[] findAllThreads() {
  ThreadGroup group = Thread.currentThread().getThreadGroup();
  ThreadGroup topGroup = group;

  // 遍历线程组树,获取根线程组
  while (group != null) {
   topGroup = group;
   group = group.getParent();
  }
  // 激活的线程数加倍
  int estimatedSize = topGroup.activeCount() * 2;
  Thread[] slackList = new Thread[estimatedSize];
  // 获取根线程组的所有线程
  int actualSize = topGroup.enumerate(slackList);
  // copyintoalistthatistheexactsize
  Thread[] list = new Thread[actualSize];
  System.arraycopy(slackList, 0, list, 0, actualSize);
  return list;
 }
 
}


java.lang.Object.wait(Native Method)
java.lang.Object.wait(Object.java:485)
java.lang.ref.Reference$ReferenceHandler.run(Reference.java:116)
java.lang.Object.wait(Native Method)
java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:118)
java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:134)
java.lang.ref.Finalizer$FinalizerThread.run(Finalizer.java:159)
java.lang.Thread.getStackTrace(Thread.java:1436)
test.main(test.java:33)