FileDocCategorySizeDatePackage
ThreadLister.javaAPI DocExample3716Mon Sep 22 13:30:32 BST 1997None

ThreadLister.java

// This example is from _Java Examples in a Nutshell_. (http://www.oreilly.com)
// Copyright (c) 1997 by David Flanagan
// This example is provided WITHOUT ANY WARRANTY either expressed or implied.
// You may study, use, modify, and distribute it for non-commercial purposes.
// For any commercial use, see http://www.davidflanagan.com/javaexamples

import java.io.*;

/**
 * This class contains a useful static method for listing all threads
 * and threadgroups in the VM.  It also has a simple main() method so it
 * can be run as a standalone program.
 **/
public class ThreadLister {
  /** Display information about a thread. */
  private static void printThreadInfo(PrintWriter out, Thread t, 
                                        String indent) {
    if (t == null) return;
    out.println(indent + "Thread: " + t.getName() +
                "  Priority: " + t.getPriority() +
                (t.isDaemon()?" Daemon":"") +
                (t.isAlive()?"":" Not Alive"));
  }
  
  /** Display info about a thread group and its threads and groups */
  private static void printGroupInfo(PrintWriter out, ThreadGroup g, 
                                 String indent) {
    if (g == null) return;
    int num_threads = g.activeCount();
    int num_groups = g.activeGroupCount();
    Thread[] threads = new Thread[num_threads];
    ThreadGroup[] groups = new ThreadGroup[num_groups];
    
    g.enumerate(threads, false);
    g.enumerate(groups, false);
    
    out.println(indent + "Thread Group: " + g.getName() + 
                "  Max Priority: " + g.getMaxPriority() +
                (g.isDaemon()?" Daemon":""));
    
    for(int i = 0; i < num_threads; i++)
      printThreadInfo(out, threads[i], indent + "    ");
    for(int i = 0; i < num_groups; i++)
      printGroupInfo(out, groups[i], indent + "    ");
  }
  
  /** Find the root thread group and list it recursively */
  public static void listAllThreads(PrintWriter out) {
    ThreadGroup current_thread_group;
    ThreadGroup root_thread_group;
    ThreadGroup parent;
    
    // Get the current thread group
    current_thread_group = Thread.currentThread().getThreadGroup();
    
    // Now go find the root thread group
    root_thread_group = current_thread_group;
    parent = root_thread_group.getParent();
    while(parent != null) {
      root_thread_group = parent;
      parent = parent.getParent();
    }
    
    // And list it, recursively
    printGroupInfo(out, root_thread_group, "");
  }
  
  /**
   * The main() method:  just print the list of threads to the console
   **/
  public static void main(String[] args) {
    PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out));
    ThreadLister.listAllThreads(out);
    out.flush();
  }

  /**
   * This nested class is a simple applet that displays the output of
   * ThreadLister.listAllThreads() when run from an the start() method of
   * an applet.  The output from an applet is typically different than the
   * output when run from a standalone program.
   **/
  public static class Applet extends java.applet.Applet {
    java.awt.TextArea textarea;  // Where to display the output.
    
    /** Create a text area to put our listing in */
    public void init() {
      textarea = new java.awt.TextArea();
      this.setLayout(new java.awt.BorderLayout());
      this.add("Center", textarea);
    }

    /** When the applet starts, list all the threads */
    public void start() {
      StringWriter sout = new StringWriter();  // Capture listing in a string
      PrintWriter out = new PrintWriter(sout);
      ThreadLister.listAllThreads(out);
      out.flush();
      textarea.setText(sout.toString());       // Display the listing
    }
  }
}