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

本文介绍了一种基于Java的线程池实现方案,包括ThreadPool接口定义、CachedThreadPool的具体实现、ServerThreadPoolExecutor应用示例及自定义拒绝策略AbortPolicyWithReport等。此外还提供了一个带有线程命名功能的线程工厂NamedThreadFactory。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

完:)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值