public abstract class ThreadPoolInitPolicy {
protected static volatile ThreadPoolExecutor executor;
protected static final int DEFAULT_QUEUE_CAPACITY = 10000;
protected static final long DEFAULT_KEEP_ALIVE_TIME = 1L;
protected static final String DEFAULT_THREAD_NAME_PREFIX = "yourappname-thread";
public abstract ThreadPoolExecutor initExecutor();
}
public class SingleThreadPolicy extends ThreadPoolInitPolicy {
@Override
public ThreadPoolExecutor initExecutor() {
int corePoolSize = 1;
int maxPoolSize = 1;
ThreadPoolExecutor.CallerRunsPolicy policy = new ThreadPoolExecutor.CallerRunsPolicy();
BlockingQueue<Runnable> workQueue = new ArrayBlockingQueue<>(DEFAULT_QUEUE_CAPACITY);
ThreadFactory threadFactory =
new ThreadFactoryBuilder()
.setNameFormat(DEFAULT_THREAD_NAME_PREFIX + "-%d")
.setDaemon(true)
.build();
return new ThreadPoolExecutor(
corePoolSize,
maxPoolSize,
DEFAULT_KEEP_ALIVE_TIME,
TimeUnit.HOURS,
workQueue,
threadFactory,
policy);
}
}
public class MaxThreadPoolPolicy extends ThreadPoolInitPolicy {
@Override
public ThreadPoolExecutor initExecutor() {
int coreCount = Runtime.getRuntime().availableProcessors();
int corePoolSize = coreCount + 1;
int maxPoolSize = coreCount + 1;
ThreadPoolExecutor.CallerRunsPolicy policy = new ThreadPoolExecutor.CallerRunsPolicy();
BlockingQueue<Runnable> workQueue = new ArrayBlockingQueue<>(DEFAULT_QUEUE_CAPACITY);
ThreadFactory threadFactory =
new ThreadFactoryBuilder()
.setNameFormat(DEFAULT_THREAD_NAME_PREFIX + "-%d")
.setDaemon(true)
.build();
return new ThreadPoolExecutor(
corePoolSize,
maxPoolSize,
DEFAULT_KEEP_ALIVE_TIME,
TimeUnit.HOURS,
workQueue,
threadFactory,
policy);
}
}
public final class AppThreadPoolExecutor {
private static volatile ThreadPoolExecutor executor;
private AppThreadPoolExecutor () {}
public static ThreadPoolExecutor getExecutor() {
if (executor != null) {
return executor;
}
synchronized (AppThreadPoolExecutor.class) {
if (executor == null) {
executor = initExecutor();
}
}
return executor;
}
private static ThreadPoolExecutor initExecutor() {
ThreadPoolInitPolicy policy = new SingleThreadPolicy();
return policy.initExecutor();
}
}