public class ThreadLister
{
	private static void print_thread_info(Thread t,String indent)
	{
		if (t == null) return;
		System.out.println(indent + "Thread:" + t.getName() + " Priority " + t.getPriority() + (t.isDaemon()?" Daemon":"") + (t.isAlive()?"":" Not Alive"));
		 
	}


	private static void list_group(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);
		System.out.println(indent + "Thread Group:" + g.getName() + " MaxPriority: " + g.getMaxPriority() + (g.isDaemon()?" Daemon":""));
		for (int i = 0;i < num_threads;i++)
			print_thread_info(threads[i],indent + "  ");
		for (int i = 0;i < num_groups; i++)
			list_group(groups[i],indent + "  ");
			
	}
	
	public static void listAllThreads()
	{
		ThreadGroup current_thread_group;
		ThreadGroup root_thread_group;
		ThreadGroup parent;
		
		current_thread_group = Thread.currentThread().getThreadGroup();
		root_thread_group = current_thread_group;
		parent = root_thread_group.getParent();
		while (parent != null)
		{
			root_thread_group = parent;
			parent = parent.getParent();
		}
		list_group(root_thread_group,"");
	
	}
	
	
}
