package org.infinispan.commons.executors; import java.util.concurrent.BlockingQueue; import java.util.concurrent.ExecutorService; import java.util.concurrent.LinkedBlockingQueue; import java.util.concurrent.SynchronousQueue; import java.util.concurrent.ThreadFactory; import java.util.concurrent.ThreadPoolExecutor; import java.util.concurrent.TimeUnit; import org.infinispan.commons.logging.Log; import org.infinispan.commons.logging.LogFactory; /** * @author Galder ZamarreƱo */ public class BlockingThreadPoolExecutorFactory implements ThreadPoolExecutorFactory<ExecutorService> { private static final Log log = LogFactory.getLog(BlockingThreadPoolExecutorFactory.class); private final int maxThreads; private final int coreThreads; private final int queueLength; private final long keepAlive; public BlockingThreadPoolExecutorFactory( int maxThreads, int coreThreads, int queueLength, long keepAlive) { this.maxThreads = maxThreads; this.coreThreads = coreThreads; this.queueLength = queueLength; this.keepAlive = keepAlive; } public int maxThreads() { return maxThreads; } public int coreThreads() { return coreThreads; } public int queueLength() { return queueLength; } public long keepAlive() { return keepAlive; } @Override public ExecutorService createExecutor(ThreadFactory threadFactory) { BlockingQueue<Runnable> queue = queueLength == 0 ? new SynchronousQueue<Runnable>() : new LinkedBlockingQueue<Runnable>(queueLength); return new ThreadPoolExecutor(coreThreads, maxThreads, keepAlive, TimeUnit.MILLISECONDS, queue, threadFactory, new ThreadPoolExecutor.CallerRunsPolicy()); } @Override public void validate() { if (coreThreads < 0) throw log.illegalValueThreadPoolParameter("core threads", ">= 0"); if (maxThreads <= 0) throw log.illegalValueThreadPoolParameter("max threads", "> 0"); if (maxThreads < coreThreads) throw log.illegalValueThreadPoolParameter( "max threads and core threads", "max threads >= core threads"); if (keepAlive < 0) throw log.illegalValueThreadPoolParameter("keep alive time", ">= 0"); if (queueLength < 0) throw log.illegalValueThreadPoolParameter("work queue length", ">= 0"); } @Override public String toString() { return "BlockingThreadPoolExecutorFactory{" + "maxThreads=" + maxThreads + ", coreThreads=" + coreThreads + ", queueLength=" + queueLength + ", keepAlive=" + keepAlive + '}'; } public static BlockingThreadPoolExecutorFactory create(int maxThreads, int queueSize) { int coreThreads = queueSize == 0 ? 1 : maxThreads; return new BlockingThreadPoolExecutorFactory( maxThreads, coreThreads, queueSize, 60000); } }