/***************************************************
*
* cismet GmbH, Saarbruecken, Germany
*
* ... and it just works.
*
****************************************************/
package Sirius.navigator;
import java.util.concurrent.Executors;
import java.util.concurrent.ThreadFactory;
import java.util.concurrent.atomic.AtomicInteger;
/**
* DOCUMENT ME!
*
* @author martin.scholl@cismet.de
* @version $Revision$, $Date$
*/
public final class NavigatorConcurrency {
//~ Static fields/initializers ---------------------------------------------
private static final transient ThreadGroup NAVIGATOR_THREAD_GROUP;
static {
final SecurityManager s = System.getSecurityManager();
final ThreadGroup parent = (s != null) ? s.getThreadGroup() : Thread.currentThread().getThreadGroup();
NAVIGATOR_THREAD_GROUP = new ThreadGroup(parent, "Navigator"); // NOI18N
}
//~ Constructors -----------------------------------------------------------
/**
* Creates a new SudplanConcurrency object.
*/
private NavigatorConcurrency() {
}
//~ Methods ----------------------------------------------------------------
/**
* DOCUMENT ME!
*
* @param prefix DOCUMENT ME!
*
* @return DOCUMENT ME!
*/
public static ThreadFactory createThreadFactory(final String prefix) {
return createThreadFactory(prefix, null);
}
/**
* DOCUMENT ME!
*
* @param prefix DOCUMENT ME!
* @param excHandler DOCUMENT ME!
*
* @return DOCUMENT ME!
*/
public static ThreadFactory createThreadFactory(final String prefix,
final Thread.UncaughtExceptionHandler excHandler) {
return new NavigatorThreadFactory(prefix, excHandler);
}
//~ Inner Classes ----------------------------------------------------------
/**
* Very similar to the {@link Executors#defaultThreadFactory()} implementation.
*
* @version $Revision$, $Date$
*/
private static final class NavigatorThreadFactory implements ThreadFactory {
//~ Static fields/initializers -----------------------------------------
private static final AtomicInteger POOL_NUMBER = new AtomicInteger(1);
//~ Instance fields ----------------------------------------------------
private final transient String prefix;
private final transient AtomicInteger createCount;
private final transient Thread.UncaughtExceptionHandler excHandler;
//~ Constructors -------------------------------------------------------
/**
* Creates a new SudplanThreadFactory object.
*
* @param prefix DOCUMENT ME!
* @param excHandler DOCUMENT ME!
*/
NavigatorThreadFactory(final String prefix, final Thread.UncaughtExceptionHandler excHandler) {
this.prefix = prefix + "-pool-" + POOL_NUMBER.getAndIncrement() + "-thread-"; // NOI18N
this.createCount = new AtomicInteger(1);
this.excHandler = excHandler;
}
//~ Methods ------------------------------------------------------------
@Override
public Thread newThread(final Runnable r) {
final Thread t = new Thread(NAVIGATOR_THREAD_GROUP, r, prefix + createCount.getAndIncrement(), 0);
t.setDaemon(false);
t.setPriority(Thread.NORM_PRIORITY);
t.setUncaughtExceptionHandler(excHandler);
return t;
}
}
}