package net.sourceforge.tuned;


import java.util.concurrent.ThreadFactory;
import java.util.concurrent.atomic.AtomicInteger;


public class DefaultThreadFactory implements ThreadFactory {
	
	private final AtomicInteger threadNumber = new AtomicInteger(0);
	private final ThreadGroup group;
	
	private final int priority;
	private final boolean daemon;
	
	
	public DefaultThreadFactory(String name) {
		this(name, Thread.NORM_PRIORITY);
	}
	

	public DefaultThreadFactory(String name, int priority) {
		this(name, priority, false);
	}
	

	public DefaultThreadFactory(String groupName, int priority, boolean daemon) {
		SecurityManager sm = System.getSecurityManager();
		ThreadGroup parentGroup = (sm != null) ? sm.getThreadGroup() : Thread.currentThread().getThreadGroup();
		
		this.group = new ThreadGroup(parentGroup, groupName);
		
		this.daemon = daemon;
		this.priority = priority;
	}
	

	public Thread newThread(Runnable r) {
		Thread thread = new Thread(group, r, String.format("%s-thread-%d", group.getName(), threadNumber.incrementAndGet()));
		
		if (daemon != thread.isDaemon())
			thread.setDaemon(daemon);
		
		if (priority != thread.getPriority())
			thread.setPriority(priority);
		
		return thread;
	}
	

	public ThreadGroup getThreadGroup() {
		return group;
	}
	
}