package com.snowcattle.game.common.util;
import java.util.concurrent.*;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* 创建线程池
*
*
*/
public class ThreadPool {
/** 日志 */
private static final Logger logger = LoggerFactory.getLogger(ThreadPool.class);
/** 核心线程个数 */
private int coreSize;
/** 最多线程个数 */
private int maxSize;
/** 空闲线程保留时间 */
private int keepAliveTime;
/** 堵塞队列 */
private BlockingQueue<Runnable> workQueue;
/** 被拒绝任务处理策略 */
private RejectedExecutionHandler handler;
/** 线程池 */
private ThreadPoolExecutor threadPool;
/*线程工厂*/
private ThreadFactory threadFactory;
/**
* 初始化
*
* @param coreSize
* @param maxSize
* @param keepAliveTime
* @param workQueue
* @param workQueueCapacity
* @param handler
*/
public ThreadPool(int coreSize, int maxSize, int keepAliveTime, BlockingQueue<Runnable> workQueue, ThreadFactory threadFactory, RejectedExecutionHandler handler) {
if (coreSize < 0 || keepAliveTime < 0 || coreSize > maxSize || maxSize <= 0 || workQueue == null || threadFactory == null || handler == null) {
throw new IllegalArgumentException("All parameters must accurate.");
}
this.coreSize = coreSize;
this.maxSize = maxSize;
this.keepAliveTime = keepAliveTime;
this.workQueue = workQueue;
this.threadFactory = threadFactory;
this.handler = handler;
}
/**
* 创建线程池
*
* @return
*/
public boolean start() {
// 创建线程池
try {
if (logger.isInfoEnabled()) {
logger.info("Start create a threedPool with parameters like [ coreSize : " + this.coreSize + " maxSize : " + this.maxSize + " keepAliveTime : " + this.keepAliveTime);
}
threadPool = new ThreadPoolExecutor(coreSize, maxSize, keepAliveTime, TimeUnit.SECONDS, workQueue,threadFactory, handler);
if (logger.isInfoEnabled()) {
logger.info("Create success.");
}
return true;
} catch (Exception e) {
e.printStackTrace();
return false;
}
}
/**
* 关闭线程池
*
*/
public void stop() {
if (isStart()) {
ExecutorUtil.shutdownAndAwaitTermination(threadPool);
}
threadPool = null;
}
/**
* 判断是否打开线程池
*
* @return
*/
public boolean isStart() {
if (threadPool != null && !threadPool.isShutdown()) {
return true;
}
return false;
}
public int getCoreSize() {
return coreSize;
}
public int getMaxSize() {
return maxSize;
}
public int getKeepAliveTime() {
return keepAliveTime;
}
/**
* 添加任务
*
* @param runnable
*/
public void addTask(Runnable task) {
this.threadPool.execute(task);
}
}