设置线程池参数

语雀完整版

https://www.yuque.com/g/mingrun/embiys/xp9mvs/collaborator/join?token=z9IAMyUrfNKYissk&source=doc_collaborator# 《设置线程池参数》

  1. 如何设置线程池参数
    • 简单概念
      • CPU密集型:特点是需要大量的运算,而且没有阻塞
      • I/O密集型:需要大量的I/O(阻塞),单线程上运行I/O密集型任务 会浪费大量的时间在等待上,这时使用多线程就能加速
      • 简单参数设置:CPU密集型的就是 核心数+1,I/O密集型的就是核心数*2
    • 动态配置线程池参数
      • 实际对于上面的简单参数配置 在实际项目启动时 ,就可能不尽人意了,比如我用线程池提交 很多线程去调用下游服务,但遇到了流量高峰,提交的线程过多,下游扛不住了,这个时候最好动态化配置线程池的参数
      • 动态配置线程池步骤
        • 将线程池的 核心线程数和最大线程数放到配置文件中,然后使用监听器监控Nacos配置变化,如果发生了变化 就调用线程池的 setCorePoolSize和setMaximumPoolSize方法,他们的规则如下所示
        • setCorePoolSize(int corePoolSize)
          • 如果新设置的值小于 coreSize,多余的线程在空闲时会被回收(不保证一定回收成功)
            • 如果活动线程大于了 新设置的核心线程数,那就要将已经获得锁的 worker中断(并不一定成功,也就是不能保证活动线程数一定会小于 新设置的核心线程数)
          • 如果大于 coseSize,可能会新创建线程去执行任务
            • 新创建的线程数 =  Math.min(新增的核心线程数,队列中的的等待线程个数)
        • setMaximumPoolSize(int maximumPoolSize)
          • 如果新值 大于原来的值就直接设置
          • 如果新值 小于原来的值就要尝试着干掉一些worker
    • 线程数与CPU利用率
      • 假如一个极端的线程 把单核CPU跑满,那么如果现在有4个核,那就最多只能执行4个这种线程
      • 如果每个线程都是这样极端,然后配置的线程数有超过了 cpu数,那就徒增了切换上下文的花费,只会执行更慢
    • 线程数规划的公式
      • 公式:

      • 对上面各个参数的说明

      • 上面公式计算出来的也只是近似值,但我们依然可以根据实际情况选择一个 cpu目标使用率,然后用这个公式计算结果,再然后结合上面所讲的动态配置线程池参数 进行调整、测试,最终达到我们的目标
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值