线程池调优之动态参数配置

线程池配置参数

  • corePoolSize:线程池核心线程数
  • maximumPoolSize:线程池最大线程数
  • keepAliveTime:允许线程空闲时间(对非核心工作线程的回收)
  • TimeUnit:线程空闲时间单位
  • workQueue:线程队列(当核心线程数满了,新的任务就会放入这个队列中)
  • threadFactory:线程工厂(用于创建工作线程,自定义线程工厂可以指定线程名称)
  • handler:线程池拒绝策略(当线程队列满了且最大线程数也满了,就会执行任务拒绝策略,默认有4种)
  • allowCoreThreadTimeOut:控制核心工作线程是否需要被回收

常规线程池参数配置

- 首先提问一个面试题:现有1000个任务,10台服务器,每台机器都是4核,在任务不丢弃情况下,线程池参数该怎么配置最合理呢?
- 把这个问题拆分一下,1000个任务,10台机器,那么每台机器就负责100个任务(常规轮训负载均衡模式,不考虑其他额外情况),每台机器都是4核,那么就可以设置核心线程数和最大线程数为4,线程队列大小为96即可。
- 当然也可以把核心和最大线程数设置为5(n+1)个,线程队列大小为95,这样是为了防止线程偶尔由于页缺失故障或者其他原因暂停,出多来的一个线程也能确保CPU的调度时钟周期不会被浪费,相当于备用线程。
复制代码
  • 如果任务是CPU密集型配置:工作线程 = cpu核心数 + 1;
  • 如果任务是IO密集型场景:工作线程 = cpu核心数 * 2;
  • 所以上面例子中就是基于CPU密集型任务配置线程池。而且网上大部分文章描述线程池配置也是基于这两点来分析的。
  • 可惜理想很丰满,现实很骨感。在实际工作场景中,其实没那么容易区分线程中执行的任务是CPU密集还是IO密集,而且服务器上还会有其他应用线程抢占CPU资源,就算还有一些其他的公式计算配置线程池参数,那也是基于理想场景情况下进行配置的,所以上述配置更多的还是应用于面试中。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值