[Java] java 列出所有线程的信息 →→→→→进入此内容的聊天室

来自 , 2020-10-05, 写在 Java, 查看 129 次.
URL http://www.code666.cn/view/23350907
  1. public class ListAllRunningThread {
  2.         /**
  3.          * 列出所有线程的信息
  4.          */
  5.         public static void list(){
  6.                 //获取当前线程所属线程组的父线程组
  7.             ThreadGroup root = Thread.currentThread().getThreadGroup().getParent();
  8.             //不断循环,直到找到根线程组
  9.             while (root.getParent() != null) {
  10.                 root = root.getParent();
  11.             }
  12.             //访问根线程组下的线程
  13.             visit(root, 0);
  14.         }
  15.     /**
  16.      * 递归的显示线程组中的线程
  17.      * @param group
  18.      * @param level
  19.      */
  20.     private static void visit(ThreadGroup group, int level) {
  21.         // 获取group线程组中活动线程的估计数
  22.         int numThreads = group.activeCount();
  23.         Thread[] threads = new Thread[numThreads];
  24.         // 把此线程组中的所有活动线程复制到指定数组中。
  25.         // false表示不包括作为此线程组的子组的线程组中的线程。
  26.         numThreads = group.enumerate(threads, false);
  27.    
  28.         // 遍历活动线程数组,打印它们的名字
  29.         for (int i=0; i<numThreads; i++) {
  30.             // Get thread
  31.             Thread thread = threads[i];
  32.             for (int j=0; j<level; j++){
  33.                 System.out.print("  ");
  34.             }
  35.             System.out.println("" + thread.getName());
  36.         }
  37.    
  38.         // 获取group线程组中活动子线程组的估计数
  39.         int numGroups = group.activeGroupCount();
  40.         ThreadGroup[] groups = new ThreadGroup[numGroups];
  41.         // 把对此线程组中的所有活动子组的引用复制到指定数组中。
  42.         numGroups = group.enumerate(groups, false);
  43.    
  44.         // 递归的访问子线程组中的线程
  45.         for (int i=0; i<numGroups; i++) {
  46.             visit(groups[i], level+1);
  47.         }
  48.     }
  49.         /**
  50.          * @param args
  51.          */
  52.         public static void main(String[] args) {
  53.                 //建立一个线程组
  54.                 ThreadGroup group1 = new ThreadGroup("ThreadGroup-1");
  55.                 //建立3个线程并启动
  56.                 Thread[] threads1 = new Thread[3];
  57.                 for (int i=1; i<4; i++){
  58.                         //新的线程属于group1线程组,以ThreadA为运行对象,名字为"group1-ThreadA-i"
  59.                         threads1[i-1] = new Thread(group1, new ThreadA(i*2000), "group1-ThreadA-" + i);
  60.                         threads1[i-1].start();
  61.                 }
  62.                 //建立另一个线程组,属于group1线程组
  63.                 ThreadGroup group2 = new ThreadGroup(group1, "ThreadGroup-2");
  64.                 //建立3个线程并启动
  65.                 Thread[] threads2 = new Thread[3];
  66.                 for (int i=1; i<4; i++){
  67.                         //新的线程属于group2线程组,以ThreadA为运行对象,名字为"group2-ThreadA-i"
  68.                         threads2[i-1] = new Thread(group2, new ThreadA(i*1000), "group2-ThreadA-" + i);
  69.                         threads2[i-1].start();
  70.                 }
  71.                 //列出所有活动的线程的名字
  72.             System.out.println("当前虚拟机中所有正在运行的线程:");
  73.                 ListAllRunningThread.list();
  74.         }
  75.        
  76.         static class ThreadA extends Thread{
  77.                 private long sleepTime = 100;
  78.                 public ThreadA(long time){
  79.                         this.sleepTime = time;
  80.                 }
  81.                 public void run(){
  82.                         try {
  83.                                 Thread.sleep(this.sleepTime);
  84.                         } catch (InterruptedException e) {
  85.                                 e.printStackTrace();
  86.                         }
  87.                 }
  88.         }
  89. }

回复 "java 列出所有线程的信息"

这儿你可以回复上面这条便签

captcha