写在开头:
个人认为配置线程池的参数要根据实际的生产环境进行调优,并没有固定的参数配置公式,只有近似的公式然后慢慢调
获取本机的核数代码 在没有界面的机器上是必须要用到代码查看的 所以很重要
System.out.println(Runtime.getRuntime().availableProcessors());
线程池的参数:
corepoolsize : 线程池的基本线程数,表示想达到的线程数量,线程池会尽量把线程池的数量维持在这个值的上下保持稳定。
maximumpoolsize: 最大的线程数 容许数
keepAliveTime: 最大线程数到达这个时间就失效销毁
unit : keepAliveTime的单位
workQueue: 阻塞队列 当线程数达到最大值就放入该队列
ThreadFactory:线程工厂,主要用来统一创建线程;
header :拒绝策略 (4种 | )(maximumpoolsize+workQueue)大于这个就拒绝。
ThreadPoolExecutor.AbortPolicy:丢弃任务并抛出RejectedExecutionException异常。
ThreadPoolExecutor.DiscardPolicy:也是丢弃任务,但是不抛出异常。
ThreadPoolExecutor.DiscardOldestPolicy:丢弃队列最前面的任务,然后重新尝试执行任务(重复此过程)
ThreadPoolExecutor.CallerRunsPolicy:由调用线程处理该任务(main线程去执行)
配置参数:
CPU密集型 CPU的核数+1
IO密集型 一般配置 2*CPU的核数
参考公式(某大厂配置):
CPU核数/(1-阻塞系数) 阻塞系数在0.8~0.9之间
比如8核CPU 8/(1-0.9) = 80个线程数