关于java 线程池相关

public class Test {
    /**
     * 获得一个线程池
     * @param coreCount 核心线程数量
     * @param maxCount 最大线程数量
     * @param queueLength 队列长度
     * @param nameProfile 线程名字前缀
     * @param rejectedExecutionHandler 超出策略
     * @return ThreadPoolTaskExecutor
     */
    public static ThreadPoolTaskExecutor buildThreadPool(int coreCount, int maxCount, int queueLength,
                                                         String nameProfile, RejectedExecutionHandler rejectedExecutionHandler){
        if(rejectedExecutionHandler == null){
            rejectedExecutionHandler = new ThreadPoolExecutor.CallerRunsPolicy();
        }
        ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
        //配置核心线程数
        executor.setCorePoolSize(coreCount);
        //配置最大线程数
        executor.setMaxPoolSize(maxCount);
        //配置队列大小
        executor.setQueueCapacity(queueLength);
        //配置线程池中的线程的名称前缀
        executor.setThreadNamePrefix(nameProfile + "TP-");
        executor.setRejectedExecutionHandler(rejectedExecutionHandler);
        executor.initialize();

        return  executor;
    }
    /**
     * 获得一个线程池,超出策略为在当前线程执行
     * @param coreCount 核心线程数量
     * @param maxCount 最大线程数量
     * @param queueLength 队列长度
     * @param nameProfile 线程名字前缀
     * @return ThreadPoolTaskExecutor
     */
    public static ThreadPoolTaskExecutor buildThreadPool(int coreCount, int maxCount, int queueLength, String nameProfile){
        //线程池超出时默认以调用者线程执行
        RejectedExecutionHandler rejectedExecutionHandler = new ThreadPoolExecutor.CallerRunsPolicy();
        return buildThreadPool(coreCount, maxCount, queueLength, nameProfile,rejectedExecutionHandler);
    }


    public static void main(String[] args) {
        ThreadPoolTaskExecutor threadPoolTaskExecutor=buildThreadPool(10,50,62,"test_");
        for(int i=0;i<200;i++){
            threadPoolTaskExecutor.execute(new RunnableS(i));
        }
    }

}
public class RunnableS implements  Runnable {

    private int i;

    @Override
    public void run() {
        //System.out.println("::::::i::::::"+i);
        if(i<52){
            try {
                Thread.sleep( 50000);
                System.out.println(Thread.currentThread().getName()+"暂停线程------i:="+i+"|||-------------");
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }else{
            System.out.println(Thread.currentThread().getName()+"直接输出线程-----i:="+i+" |||--------------");
        }

    }

    public RunnableS(int i) {
        super();
        this.i = i;
    }
}

 基本上就是 项目启动创建核心线程数,当任务达到队列数时,会在核心线程数之外创建 核心线程数到最大线程数个线程:

如核心线程数为10个 最大线程数为50 那么当队列满值以后 (52+核心线程数10个) 在线程到到 62个的时候创建 第 11个线程。

具体解释查看 :https://zhuanlan.zhihu.com/p/35188214   文章给到启发 自己做了测试。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值