package com.bizo.asperatus.tracker.impl;
import java.util.concurrent.ThreadFactory;
import java.util.concurrent.atomic.AtomicInteger;
public final class ThreadFactoryUtils {
private ThreadFactoryUtils() { }
/**
* Construct a new ThreadFactory where threads will be marked as daemon
* and name will be <name>-<pool number>-<thread>-<thread number>
* e.g. asperatus-metrics-1-thread-1
*/
public static ThreadFactory namedDaemonThreadFactory(final String name) {
return new NamedThreadFactory(name, true);
}
private static final class NamedThreadFactory implements ThreadFactory {
private static final AtomicInteger poolNumber = new AtomicInteger(1);
private final ThreadGroup group;
private final boolean isDaemon;
private final String namePrefix;
private final AtomicInteger threadNumber = new AtomicInteger(1);
private NamedThreadFactory(final String name, final boolean isDaemon) {
final SecurityManager s = System.getSecurityManager();
group = (s != null)? s.getThreadGroup() : Thread.currentThread().getThreadGroup();
namePrefix = name + "-" + poolNumber.getAndIncrement() + "-thread-";
this.isDaemon = isDaemon;
}
@Override
public Thread newThread(final Runnable r) {
final Thread t = new Thread(group, r, namePrefix + threadNumber.getAndIncrement());
t.setDaemon(isDaemon);
return t;
}
}
}