基于 Netty + Spring 实现一个 HTTP REST 服务器(五)Gevlet 源码分享之线程池实现

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;
    }
}

完:)

猜你喜欢

转载自blog.csdn.net/qq_38692223/article/details/80269980