package com.hqyg.disjob.quence;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.ThreadFactory;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicInteger;
import com.hqyg.disjob.pojo.ThreadPoolContainer;
public class Executor {
private BaseActionQueue defaultQueue;
private ThreadPoolExecutor pool;
/**
* 执行action队列的线程池
*
* @param corePoolSize 最小线程数,包括空闲线程
* @param maxPoolSize 最大线程数
* @param keepAliveTime 当线程数大于核心时,终止多余的空闲线程等待新任务的最长时间
* @param cacheSize 执行队列大小
* @param prefix 线程池前缀名称
*/
public Executor(int corePoolSize, int maxPoolSize, int keepAliveTime, String prefix) {
TimeUnit unit = TimeUnit.MINUTES;
LinkedBlockingQueue<Runnable> workQueue = new LinkedBlockingQueue<Runnable>();//无界队列,不需要 处理策略
if (prefix == null) {
prefix = "";
}
ThreadFactory threadFactory = new Threads(prefix);
pool = new ThreadPoolExecutor(corePoolSize, maxPoolSize, keepAliveTime, unit, workQueue, threadFactory);
defaultQueue = new BaseActionQueue(this);
}
/**
* 定制化配置
* @param pool
*/
public Executor(ThreadPoolExecutor pool){
this.pool = pool ;
defaultQueue = new BaseActionQueue(this);
}
public ThreadPoolContainer getThreadPollContainer(){
ThreadPoolContainer threadPoolContainer = new ThreadPoolContainer();
threadPoolContainer.setThreadSize(this.pool.getPoolSize());
threadPoolContainer.setLargestPoolSize(this.pool.getLargestPoolSize()+this.pool.getPoolSize());
threadPoolContainer.setActiveTaskCount(this.pool.getActiveCount());
threadPoolContainer.setCompleteTaskCount((int)this.pool.getCompletedTaskCount());
threadPoolContainer.setWaitTaskCount(this.pool.getQueue().size());
threadPoolContainer.setTaskCount((int)this.pool.getTaskCount());
return threadPoolContainer;
}
public BaseActionQueue getDefaultQueue() {
return defaultQueue;
}
public void enDefaultQueue(Action action) {
if(action.getActionQueue()==null){
action.setActionQueue(defaultQueue);
}
defaultQueue.enqueue(action);
}
/**
* if you execute a temporary or disposable action then call this method,or normal and executor more times
* you should be call the enDefaultQueue method
* @param action
*/
public void execute(Runnable command) {
pool.execute(command);
}
public <T> T submit(Callable<T> command){
try {
return (T) pool.submit(command).get();
} catch (InterruptedException e) {
Log.error(this.getClass().getName()+"; submit a task excetion.",e);
e.printStackTrace();
} catch (ExecutionException e) {
Log.error(this.getClass().getName()+"; submit a task excetion.",e);
e.printStackTrace();
}
return null ;
}
public void stop() {
if (!pool.isShutdown()) {
pool.shutdown();
}
}
static class Threads implements ThreadFactory {
static final AtomicInteger poolNumber = new AtomicInteger(1);
final ThreadGroup group;
final AtomicInteger threadNumber = new AtomicInteger(1);
final String namePrefix;
public Thread newThread(Runnable runnable) {
Thread thread = new Thread(group, runnable, (new StringBuilder()).append(namePrefix).append(threadNumber.getAndIncrement()).toString(), 0L);
if (thread.isDaemon())
thread.setDaemon(false);
if (thread.getPriority() != 5)
thread.setPriority(5);
return thread;
}
Threads(String prefix) {
SecurityManager securitymanager = System.getSecurityManager();
group = securitymanager == null ? Thread.currentThread().getThreadGroup() : securitymanager.getThreadGroup();
namePrefix = (new StringBuilder()).append("pool-").append(poolNumber.getAndIncrement()).append("-").append(prefix).append("-thread-").toString();
}
}
}