package javacodebook.thread.threadlist;

/**
 * Listet die in einer Anwendung laufenden Threads gruppiert nach ihrer 
 * Thread-Gruppe auf. 
 *
 * @author Mark Donnermeyer
 */
public class ListThreads {

    private final static String TAB= "                                        ";

    
    /**
     * Listet die Threads einer ThreadGroup sowie Thread untergeordneter 
     * ThreadGroups auf. Die Threads werden nach ihrer ThreadGroup gruppiert
     */
    public synchronized void listThreads(ThreadGroup group) {
        listThreads(group, 1);
    }
    
    /**
     * Listet alle Threads einer Anwendung auf.
     */
    public synchronized void listThreads() {
        // Es sollen Alle Threads und Thread-Gruppen aufgelistet werden.
        // Dazu wird zunächst einmal die Root-Threadgruppe ausfindig gemacht
        ThreadGroup root = Thread.currentThread().getThreadGroup().getParent();
        while (root.getParent() != null)
            root = root.getParent();
        
        listThreads(root, 1);
        
    }
    
    /**
     * Listet die Threads einer ThreadGroup sowie Thread untergeordneter 
     * ThreadGroups auf. Die Threads werden nach ihrer ThreadGroup gruppiert
     */
    private void listThreads(ThreadGroup group, int level) {
        System.out.print(TAB.substring(0, level*3));
        System.out.println("[" + group.getName() + "]");
        
        int estimate, real;
        
        // Zuerst die Threads der Thread-Gruppe
        estimate = group.activeCount();
        Thread []threads = new Thread[estimate*2];
        
        real = group.enumerate(threads, false);
        for (int i=0; i<real; i++) {
            System.out.print(TAB.substring(0, level*3+3));
            System.out.print("-> " + threads[i].getName());
            System.out.println(", " + threads[i].getPriority());
        }
        
        // Und jetzt die Untergruppen.
        estimate = group.activeGroupCount();
        ThreadGroup []groups = new ThreadGroup[estimate*2];
        
        real = group.enumerate(groups, false);
        for (int i=0; i<real; i++) {
            listThreads(groups[i], level+1);
        }
    }
}