// 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 } } }