/**
* Copyright 2013 Marin Solutions
*/
package com.captaindebug.store.monitoring;
import java.lang.Thread.UncaughtExceptionHandler;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.ThreadFactory;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* Abstract base class that handles the running of a single thread via an executor service.
*
* @author Roger
*
*/
public abstract class SingleThreadRunner {
private static final Logger logger = LoggerFactory.getLogger(SingleThreadRunner.class);
private final ExecutorService executor;
public SingleThreadRunner(String threadName) {
executor = createExecutor(threadName);
}
/**
* @return A new executor service.
*/
ExecutorService createExecutor(final String threadName) {
final UncaughtExceptionHandler exceptionHandler = new UncaughtExceptionHandler() {
@Override
public void uncaughtException(Thread t, Throwable e) {
logger.error("Exception in timed list: " + e.getMessage(), e);
startRunnable();
}
};
ThreadFactory threadFactory = new ThreadFactory() {
@Override
public Thread newThread(Runnable r) {
Thread thread = new Thread(r);
thread.setDaemon(true);
thread.setName(threadName);
thread.setUncaughtExceptionHandler(exceptionHandler);
return thread;
}
};
return Executors.newSingleThreadExecutor(threadFactory);
}
/**
* Start the single background thread.
*/
protected void startRunnable() {
Runnable runnable = getRunnable();
executor.execute(runnable);
}
protected abstract Runnable getRunnable();
}