动态线程池技术的应用

本文探讨动态线程池技术的应用,分析为何使用动态线程池,其优点及解决的问题。通过封装JDK的ThreadPoolExecutor并添加动态调整参数的功能,实现了在系统压力变化时调整线程池配置,以提高资源利用率和系统稳定性。同时,文章通过实验展示了动态线程池在应对不同并发量时的效果,并指出其在实际应用中可能面临的挑战和优化方向。
摘要由CSDN通过智能技术生成

动态线程池技术的应用

提出问题:

1、为何要使用动态线程池?
2、使用动态线程池有何优点?
3、解决了哪些问题?

问题的发现:

1、为何要使用动态线程池?

我们可能很多时候都会使用池化技术,例如数据库的连接池(druid),JDK线程池,JVM的对象池等等,它们的目的建时为了减少资源创建的花销,在并发量较大的时候,系统无法准确预估要创建多少线程,假如有的请求可以申请非常多的系统资源,如果不加以限制的话,系统稳定性将大大降低。池化技术,解决了资源分配问题的疼点,使得资源利用率大大提高。

不过,Jdk自带的线程池,并不是那么的完美,我们很难一开始就预估好线程池的参数,所以我希望可以设计一个可以动态调整参数的线程池去适应并发量的突发性,以及提高系统的可伸缩性。

2、使用动态线程池有何优点?

很显然,假如我们现在的业务是希望系统在预警的时候可以给监控人员发送消息,监控人员可以在后天管理系统当中,调整线程池的参数(调参boy😊),使得系统可以承受住更大的并发量,高峰期过了以后,我们希望系统的资源可以回收给其他地方利用,那么同样需要监控人员再次调整线程池的参数。通过这样的操作,即便我们不知道怎么设置线程池参数才合适,也可以在高峰预警的时候,紧急调整线程池的参数,从而达到系统免维护升级。

3、解决了哪些问题?
很显然,资源利用率提高了,本身就是池化技术,就集成了池化技术的传统优点,然而,更重要的是它设计成可以动态调整阻塞队列大小,核心线程数大小,最大线程数大小,以及回绝的策略,所以可以不用重启系统也可以做到修改线程池参数,从而达到动态调整系统性能的一种方式,增加了系统的可伸缩性。

具体实现:

  • 首先我们使用的核心是使用JDK自带的 ThreadPoolExecutor 类,它提供了5个set的API分别是corePoolSize, MaximumPoolSize, KeepAliveTime, ThreadFactory, RejectedExecutionHandler.
  • 然后我们将这个线程池封装成在我们自己实现的一个类里面,并提供外部修改的接口
@Slf4j
public class DynamicThreadPool {
   

    /**
     * 默认核心线程数:5
     */
    private static final int CORE_POOL_SIZE = 5;
    /**
     * 默认最大线程数:10
     */
    private static final int MAX_POOL_SIZE = 10;
    /**
     * 默认队列容量:100
     */
    private static final int QUEUE_CAPACITY = 100;
    /**
     * 默认额外空闲线程存活时间
     */
    private static final Long KEEP_ALIVE_TIME = 10L;



    /**
     * 线程池
     */
    private ThreadPoolExecutor threadPool ;

    public ThreadPoolExecutor getThreadPool(){
   
        return this.threadPool;
    }

	//构造默认参数的线程池
    private DynamicThreadPool(){
   
        this.threadPool = new ThreadPoolExecutor(
                CORE_POOL_SIZE,
                MAX_POOL_SIZE,
                KEEP_ALIVE_TIME,
                TimeUnit.SECONDS,
                new FixArrayBlockingQueue<>(QUEUE_CAPACITY),
                new ThreadPoolExecutor.CallerRunsPolicy());
    }




    /**
     * Lazy load单例线程池
     * 利用JVM底层保证单例
     */
    private static class Singleton{
   
        private static DynamicThreadPool instance;

        static{
   
            instance = new DynamicThreadPool();
        }

        public static DynamicThreadPool getInstance(){
   
            return instance;
        }
    }

    /**
     * 单例
     * @return
     */
    public static DynamicThreadPool getDynamicThreadPool() {
   
        return Singleton.getInstance();
    }

    /**
     * 初始化的便捷方法
     */
    public static void init(){
   
        getDynamicThreadPool();
    }

	//暂时省略下列代码,待会往下再贴出
}

首先制定好默认的初始化参数,然后写成一个单例模式,确保不会被创建两次。
下一步则是提供修改线程池的对外方法接口

/**
    * 动态设置核心线程数
    */
   public ServiceResponse setCorePoolSize(int corePoolSize){
   
       try{
   
       		//动态设置核心线程数
           this.getThreadPool()
           .setCorePoolSize(corePoolSize);
           log.info(
  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 7
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值