/*
* ThreadUtils.java
*
* Created on Feb 26, 2010, 12:10:25 PM
*
* Description: Provides thread utility methods.
*
* Copyright (C) Feb 26, 2010 reed.
*
* This program is free software; you can redistribute it and/or modify it under the terms
* of the GNU General Public License as published by the Free Software Foundation; either
* version 3 of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
* See the GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License along with this program;
* if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
package org.texai.util;
import java.lang.management.ManagementFactory;
import java.lang.management.ThreadMXBean;
import java.util.ArrayList;
import java.util.List;
import net.jcip.annotations.ThreadSafe;
import org.apache.log4j.Logger;
/**
*
* @author reed
*/
@ThreadSafe
public final class ThreadUtils {
/** the logger */
private static final Logger LOGGER = Logger.getLogger(ThreadUtils.class);
/** the root JVM thread group */
private static ThreadGroup rootThreadGroup = null;
/** Prevents the instantiation of this utility class. */
private ThreadUtils() {
}
/** Returns a list of all threads.
*
* @return a list of all threads
*/
public static List<Thread> getAllThreads() {
final ThreadGroup root = getRootThreadGroup();
final ThreadMXBean thbean = ManagementFactory.getThreadMXBean();
int nAlloc = thbean.getThreadCount();
@SuppressWarnings("UnusedAssignment")
int n = 0;
Thread[] threads;
do {
nAlloc *= 2;
threads = new Thread[nAlloc];
n = root.enumerate(threads, true);
} while (n == nAlloc);
final List<Thread> threadList = new ArrayList<>();
for (final Thread thread : threads) {
if (thread != null) {
threadList.add(thread);
}
}
return threadList;
}
/** Returns the root thread group.
*
* @return the root thread group
*/
public synchronized static ThreadGroup getRootThreadGroup() {
if (rootThreadGroup == null) {
rootThreadGroup = Thread.currentThread().getThreadGroup();
ThreadGroup parentThreadGroup;
while ((parentThreadGroup = rootThreadGroup.getParent()) != null) {
rootThreadGroup = parentThreadGroup;
}
}
return rootThreadGroup;
}
/** Logs all threads. */
public static void logThreads() {
LOGGER.info("all threads ...");
for (final Thread thread : getAllThreads()) {
LOGGER.info(" " + thread.getName());
}
}
}