线程池配置参数
- 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资源,就算还有一些其他的公式计算配置线程池参数,那也是基于理想场景情况下进行配置的,所以上述配置更多的还是应用于面试中。