SpringBoot中线程池ThreadPool初始化,并且可配置线程池参数

        首先是线程池的配置类如下:

@Configuration
public class ThreadPoolHandle {

    @Value("${single.threadPool.core}")
    private Integer core;
    @Value("${single.threadPool.max}")
    private Integer max;
    @Value("${single.threadPool.keepLive}")
    private long keepLive;
    @Value("${single.threadPool.queue}")
    private Integer queue;

    @Bean
    public ThreadPoolExecutor geniusThreadPool(){
        //创建线程池
        ThreadPoolExecutor threadPool = new ThreadPoolExecutor(
                //线程池中的常驻核心线程数(假设银行窗口一般情况下开两个)
                core,
                //线程池能够容纳同时执行的最大线程数,此值必须>=1(特殊情况下比如周末办理业务人多,增设到5个窗口)
                max,
                //多余的空闲线程的存活时间 当前线程池数量超过 "corepoolsize"(认为有问题 应该是超过 maximumpoolsize吧)
                keepLive,
                // 当空闲时间达到keepalivetime值时,多余空闲线程会被销毁直到只剩下 corePoolSize个线程为止
                //unit keepAliveTime的单位
                TimeUnit.SECONDS,
                //任务队列,被提交但尚未被执行的任务(银行窗口的等待区的座位)
                new LinkedBlockingQueue<>(queue),
                //线程工厂,用于生成线程池中的工作线程
                new XXXXThreadFactory("dataHandlePool"),
                //拒绝策略,当任务队列[LindedBlockingQueue]满了,
                // 并且工作线程[自己理解为办理业务的总认识,如以下代码中的10]大于等于线程池的最大线程数时如何拒绝多余工作线程
                new ThreadPoolExecutor.AbortPolicy()
        );
        threadPool.allowCoreThreadTimeOut(true);
        return threadPool;
    }

        yml中的配置如下:

single:
  threadPool:
    core: 8
    max: 18
    keepLive: 10
    queue: 100

        线程工厂如下:

public class AtfRiskThreadFactory implements ThreadFactory {
    private static final AtomicInteger poolNumber = new AtomicInteger(1);
    private final ThreadGroup group;
    private final AtomicInteger threadNumber = new AtomicInteger(1);
    private final String namePrefix;

    AtfRiskThreadFactory(String name) {
        SecurityManager s = System.getSecurityManager();
        group = (s != null) ? s.getThreadGroup() :
                Thread.currentThread().getThreadGroup();
        if(name == null || "".equals(name.trim())){
            name = "pool";
        }
        namePrefix = name + "-" +
                poolNumber.getAndIncrement() +
                "-thread-";
    }

    @Override
    public Thread newThread(Runnable r) {
        Thread t = new Thread(group, r,
                namePrefix + threadNumber.getAndIncrement(),
                0);
        if (t.isDaemon()){
            t.setDaemon(false);
        }
        if (t.getPriority() != Thread.NORM_PRIORITY){
            t.setPriority(Thread.NORM_PRIORITY);
        }
        return t;
    }
}

        线程池的使用:

            try{

                threadPool.execute(()->{
                    
                    System.out.println(Thread.currentThread().getName()+"  "+ finalI +" 办理业务");

                });

            }catch (RejectedExecutionException e){
                System.out.println("捕获到异常===================->");
                System.out.println("把消息:"+finalI+"保存起来");
            }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值