Cyh的博客

Email:kissyan4916@163.com
posts - 26, comments - 19, trackbacks - 0, articles - 220

线程7--列出虚拟机中所有的线程

Posted on 2009-06-02 20:49 啥都写点 阅读(261) 评论(0)  编辑  收藏 所属分类: J2SE
关键技术:
  • 虚拟机中的任何线程都处于线程组ThreadGroup中,线程组也可以包含子线程组。
  • Thread的currentThread静态方法能够获得当前线程的引用。
  • Thread的getThreadGroup实例方法能够获得当前线程所属的线程组。
  • ThreadGroup的getParent实例方法能够获得当前线程组的父线程组,根线程组的父线程组为NULL。

package book.thread;

public class ListAllRunningThread {
    
/**
     * 列出所有线程的信息
     
*/
    
public static void list(){
        
//获取当前线程所属线程组的父线程组
        ThreadGroup root = Thread.currentThread().getThreadGroup().getParent();
        
//不断循环,直到找到根线程组
        while (root.getParent() != null) {
            root 
= root.getParent();
        }
        
//访问根线程组下的线程
        visit(root, 0);
    }
    
/**
     * 递归的显示线程组中的线程
     * 
@param group
     * 
@param level
     
*/
    
private static void visit(ThreadGroup group, int level) {
        
// 获取group线程组中活动线程的估计数
        int numThreads = group.activeCount();
        Thread[] threads 
= new Thread[numThreads];
        
// 把此线程组中的所有活动线程复制到指定数组中。
        
// false表示不包括作为此线程组的子组的线程组中的线程。
        numThreads = group.enumerate(threads, false);
    
        
// 遍历活动线程数组,打印它们的名字
        for (int i=0; i<numThreads; i++) {
            
// Get thread
            Thread thread = threads[i];
            
for (int j=0; j<level; j++){
                System.out.print(
"  ");
            }
            System.out.println(
"" + thread.getName());
        }
    
        
// 获取group线程组中活动子线程组的估计数
        int numGroups = group.activeGroupCount();
        ThreadGroup[] groups 
= new ThreadGroup[numGroups];
        
// 把对此线程组中的所有活动子组的引用复制到指定数组中。
        numGroups = group.enumerate(groups, false);
    
        
// 递归的访问子线程组中的线程
        for (int i=0; i<numGroups; i++) {
            visit(groups[i], level
+1);
        }
    }
    
/**
     * 
@param args
     
*/
    
public static void main(String[] args) {
        
//建立一个线程组
        ThreadGroup group1 = new ThreadGroup("ThreadGroup-1");
        
//建立3个线程并启动
        Thread[] threads1 = new Thread[3];
        
for (int i=1; i<4; i++){
            
//新的线程属于group1线程组,以ThreadA为运行对象,名字为"group1-ThreadA-i"
            threads1[i-1= new Thread(group1, new ThreadA(i*2000), "group1-ThreadA-" + i);
            threads1[i
-1].start();
        }
        
//建立另一个线程组,属于group1线程组
        ThreadGroup group2 = new ThreadGroup(group1, "ThreadGroup-2");
        
//建立3个线程并启动
        Thread[] threads2 = new Thread[3];
        
for (int i=1; i<4; i++){
            
//新的线程属于group2线程组,以ThreadA为运行对象,名字为"group2-ThreadA-i"
            threads2[i-1= new Thread(group2, new ThreadA(i*1000), "group2-ThreadA-" + i);
            threads2[i
-1].start();
        }
        
//列出所有活动的线程的名字
        System.out.println("当前虚拟机中所有正在运行的线程:");
        ListAllRunningThread.list();
    }
    
    
static class ThreadA extends Thread{
        
private long sleepTime = 100;
        
public ThreadA(long time){
            
this.sleepTime = time;
        }
        
public void run(){
            
try {
                Thread.sleep(
this.sleepTime);
            } 
catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}



                                                                                                       --    学海无涯