org.uncommons.util.concurrent.ConfigurableThreadFactory Maven / Gradle / Ivy
The newest version!
//=============================================================================
// Copyright 2006-2010 Daniel W. Dyer
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//=============================================================================
package org.uncommons.util.concurrent;
import java.util.concurrent.ThreadFactory;
import org.uncommons.util.id.IDSource;
import org.uncommons.util.id.IntSequenceIDSource;
import org.uncommons.util.id.StringPrefixIDSource;
/**
* Thread factory that creates threads for use by a
* {@link java.util.concurrent.ThreadPoolExecutor}. The factory can be
* configured to customise the names, priority and daemon status of created
* threads.
* @author Daniel Dyer
*/
public class ConfigurableThreadFactory implements ThreadFactory
{
/**
* A default exception handler that simply logs the stack trace of the exception.
*/
private static final Thread.UncaughtExceptionHandler DEFAULT_EXCEPTION_HANDLER
= new Thread.UncaughtExceptionHandler()
{
public void uncaughtException(Thread thread, Throwable throwable)
{
// Log any exceptions thrown.
throwable.printStackTrace();
}
};
private final IDSource nameGenerator;
private final int priority;
private final boolean daemon;
private final Thread.UncaughtExceptionHandler uncaughtExceptionHandler;
/**
* @param namePrefix The String prefix used to assign identifiers to created threads.
* @param priority The initial priority for created threads.
* @param daemon Whether or not created threads should be daemon threads or user threads.
* The JVM exits when the only threads running are all daemon threads.
*/
public ConfigurableThreadFactory(String namePrefix,
int priority,
boolean daemon)
{
this(namePrefix, priority, daemon, DEFAULT_EXCEPTION_HANDLER);
}
/**
* @param namePrefix The String prefix used to assign identifiers to created threads.
* @param priority The initial priority for created threads.
* @param daemon Whether or not created threads should be daemon threads or user threads.
* The JVM exits when the only threads running are all daemon threads.
* @param uncaughtExceptionHandler A strategy for dealing with uncaught exceptions.
*/
public ConfigurableThreadFactory(String namePrefix,
int priority,
boolean daemon,
Thread.UncaughtExceptionHandler uncaughtExceptionHandler)
{
this.nameGenerator = new StringPrefixIDSource(namePrefix + '-', new IntSequenceIDSource());
this.priority = priority;
this.daemon = daemon;
this.uncaughtExceptionHandler = uncaughtExceptionHandler;
}
/**
* Creates a new thread configured according to this factory's parameters.
* @param runnable The runnable to be executed by the new thread.
* @return The created thread.
*/
public Thread newThread(Runnable runnable)
{
Thread thread = new Thread(runnable, nameGenerator.nextID());
thread.setPriority(priority);
thread.setDaemon(daemon);
thread.setUncaughtExceptionHandler(uncaughtExceptionHandler);
return thread;
}
}