自定义线程池ThreadPoolExecutor

本文介绍了在项目中使用线程池时遇到的问题,提出自定义线程池的方法,包括创建ThreadPollConfig和CustomNameThreadFactory,以帮助更好地定位异常。同时,通过分析Spring源码,揭示了如何在默认线程工厂中定制线程名。
摘要由CSDN通过智能技术生成

一、背景:

在项目中,我们很多地方都会用到线程池,如果要是线程池异常

我们只能了解到线程池出现问题,但是不知道哪一个线程出现异常,数据表导入线程异常,邮件线程异常、短信功能异常等,很难直接找到问题所在。所以自定义线程就很有必要。

二、目的

看了背景,我们就知道为什么要自定义线程,为了更好的定位异常问题。

三、实现

1.编写属性类 ThreadPollConfig

定义一个线程Bean对象

@Configuration
public class ThreadPollConfig {

    @Bean(name = "emailThread")
    public ThreadPoolExecutor getEmailThreadPoll(){

        //工厂对象
        CustomNameThreadFactory mail = new CustomNameThreadFactory("mail");

        return new ThreadPoolExecutor(20,50,5,
                TimeUnit.SECONDS, new LinkedBlockingDeque<>(50),mail,
                new ThreadPoolExecutor.DiscardPolicy());
    }

}
2.编写一个工厂 实现线程工厂 ThreadFactory 重写方法newThread(),

这里其实并没有直接重写newThread(),只是通过 风方法CustomNameThreadFactory()

将变量进行修改

public class CustomNameThreadFactory implements ThreadFactory {
    private final AtomicInteger poolNumber = new AtomicInteger();

    private final ThreadGroup group;

    private final String namePrefix;

    private final AtomicInteger threadNumber = new AtomicInteger(0);


    /**
     * @param name 线程名
     */
    public CustomNameThreadFactory(String name) {
        SecurityManager s = System.getSecurityManager();
        group = (s != null) ? s.getThreadGroup() :
                Thread.currentThread().getThreadGroup();
        if (!StringUtils.isNotBlank(name)) {
            name = "pool ";
        }
        namePrefix = "pool" + "-" +
        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;
    }
}
3.结果展示

4.spring源码解析:

4.1.进入ThreadPoolExecutor

4.2.进入defaultThreadFactory

4.3.进入DefaultThreadFactory 查看spring如何定义线程

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值