Gevlet 源码分享之线程池实现
关于线程池的实现 此处就不再赘述。代码如下:
ThreadPool 接口
import java.util.concurrent.Executor;
public interface ThreadPool {
Executor getExecutor(int coreNum,int threadNum, int queueNum);
}
ThreadPool 接口实现 CachedThreadPool (参数只是测试用)
public class CachedThreadPool implements ThreadPool {
@Override
public Executor getExecutor(int coreNum, int threadNum, int queueNum) {
return new ThreadPoolExecutor(
coreNum,
threadNum,
1000L,
TimeUnit.MILLISECONDS,
(BlockingQueue) (queueNum == 0 ? new SynchronousQueue() : (queueNum < 0 ? new LinkedBlockingQueue() : new LinkedBlockingQueue(queueNum))),
new NamedThreadFactory("Gevlet server threadpool", true),
new AbortPolicyWithReport("Gevlet server threadpool")
);
}
}
线程池应用类 ServerThreadPoolExecutor
public class ServerThreadPoolExecutor {
private static final int threadNum = 32;
private static final int coreNum = 8;
private static final int queueNum = 0;
private static Executor executor = new CachedThreadPool().getExecutor(coreNum,threadNum,queueNum);
public static Executor getExecutor(){
return executor;
}
}
线程池 AbortPolicy 策略实现 AbortPolicyWithReport
public class AbortPolicyWithReport extends ThreadPoolExecutor.AbortPolicy {
private final String threadName;
public AbortPolicyWithReport(String threadName) {
this.threadName = threadName;
}
@Override
public void rejectedExecution(Runnable r, ThreadPoolExecutor e) {
String msg = String.format("Thread pool is EXHAUSTED! Thread Name: %s, Pool Size: %d (active: %d, core: %d, max: %d, largest: %d), Task: %d (completed: %d), Executor status:(isShutdown:%s, isTerminated:%s, isTerminating:%s), in %s://%s:%d!", new Object[]{this.threadName, Integer.valueOf(e.getPoolSize()), Integer.valueOf(e.getActiveCount()), Integer.valueOf(e.getCorePoolSize()), Integer.valueOf(e.getMaximumPoolSize()), Integer.valueOf(e.getLargestPoolSize()), Long.valueOf(e.getTaskCount()), Long.valueOf(e.getCompletedTaskCount()), Boolean.valueOf(e.isShutdown()), Boolean.valueOf(e.isTerminated()), Boolean.valueOf(e.isTerminating())});
throw new RejectedExecutionException(msg);
}
}
线程工厂 ThreadFactory 实现 NamedThreadFactory
public class NamedThreadFactory implements ThreadFactory {
private static final AtomicInteger POOL_SEQ = new AtomicInteger(1);
private final AtomicInteger mThreadNum;
private final String mPrefix;
private final boolean mDaemo;
private final ThreadGroup mGroup;
public NamedThreadFactory() {
this("pool-" + POOL_SEQ.getAndIncrement(), false);
}
public NamedThreadFactory(String prefix) {
this(prefix, false);
}
public NamedThreadFactory(String prefix, boolean daemo) {
this.mThreadNum = new AtomicInteger(1);
this.mPrefix = prefix + "-thread-";
this.mDaemo = daemo;
SecurityManager s = System.getSecurityManager();
this.mGroup = s == null?Thread.currentThread().getThreadGroup():s.getThreadGroup();
}
public Thread newThread(Runnable runnable) {
String name = this.mPrefix + this.mThreadNum.getAndIncrement();
Thread ret = new Thread(this.mGroup, runnable, name, 0L);
ret.setDaemon(this.mDaemo);
return ret;
}
public ThreadGroup getThreadGroup() {
return this.mGroup;
}
}