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

- 公式:
-
-
-
- 对上面各个参数的说明

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

被折叠的 条评论
为什么被折叠?



