java线程池合理设置最大线程数和核心线程数
工作中有这样一个场景,需要处理千万级别的数据的一个算法,大部分是增删查的操作。这个时候就需要使用多线程去处理。
一开始是这么配置的:
@Configuration
@EnableAsync(proxyTargetClass = true)//利用@EnableAsync注解开启异步任务支持
@ComponentScan({"com.ctfojt.auditbcarslogo.service"}) //必须加此注解扫描包
public class ThreadPoolConfig implements AsyncConfigurer {@Overridepublic Executor getAsyncExecutor() {ThreadPoolTaskExecutor taskExecutor = new ThreadPoolTaskExecutor();taskExecutor.setCorePoolSize(10);//核心线程大小taskExecutor.setMaxPoolSize(20);//最大线程大小taskExecutor.setQueueCapacity(500);//队列最大容量//当提交的任务个数大于QueueCapacity,就需要设置该参数,但spring提供的都不太满足业务场景,可以自定义一个,也可以注意不要超过QueueCapacity即可taskExecutor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());taskExecutor.setWaitForTasksToCompleteOnShutdown(true);taskExecutor.setAwaitTerminationSeconds(10);taskExecutor.setThreadNamePrefix("BCarLogo-Thread-");taskExecutor.initialize();return taskExecutor;}
}
这样配置效率很低,一天大概能处理30多万的数据。往后随着插入表的数据越来越多,处理速度也随之降低,跑个一两天之后,差不多能够处理10万多。完全满足不了需求。
后来网上查询线程池核心数配置,大部分都是这样的:
注:IO密集型(某大厂实践经验)核心线程数 = CPU核数 / (1-阻塞系数)
或着
CPU密集型:核心线程数 = CPU核数 + 1
IO密集型:核心线程数 = CPU核数 * 2
也尝试着这么配置,结果发现效率并不理想,提高不了多少。
这里是引用
什么是CPU密集型?什么是IO密集型?
最后,我是这么配置的,结果效率大大提升,仅用不到一天的数据,就跑完了千万级的数据。
//获取当前机器的核数
public static final int cpuNum = Runtime.getRuntime().availableProcessors();@Overridepublic Executor getAsyncExecutor() {ThreadPoolTaskExecutor taskExecutor = new ThreadPoolTaskExecutor();taskExecutor.setCorePoolSize(cpuNum);//核心线程大小taskExecutor.setMaxPoolSize(cpuNum * 2);//最大线程大小taskExecutor.setQueueCapacity(500);//队列最大容量//当提交的任务个数大于QueueCapacity,就需要设置该参数,但spring提供的都不太满足业务场景,可以自定义一个,也可以注意不要超过QueueCapacity即可taskExecutor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());taskExecutor.setWaitForTasksToCompleteOnShutdown(true);taskExecutor.setAwaitTerminationSeconds(60);taskExecutor.setThreadNamePrefix("BCarLogo-Thread-");taskExecutor.initialize();return taskExecutor;}
完美的解决了问题,希望对大家有所帮助!!!
java线程池合理设置最大线程数和核心线程数相关推荐
- Java线程池七个参数详解:核心线程数、最大线程数、空闲线程存活时间、时间单位、工作队列、线程工厂、拒绝策略
源码简介 ThreadPoolExecutor是JDK中的线程池实现,这个类实现了一个线程池需要的各个方法,它提供了任务提交.线程管理.监控等方法. 下面是ThreadPoolExecutor类的构造 ...
- java线程池大小_线程池大小设置多少合适?java如何合理设置线程池大小?
在连接数据库时我们经常会用到线程池,而有时候我们就会烦恼,线程池的大小究竟该设置成多大才合适呢?小伙伴们知道要如何合理设置线程池大小吗?下面跟小编一起来看看吧. 一般来说,我们线程池究竟设置多大是基于 ...
- c++ socket线程池_从连接器组件看Tomcat的线程模型——NIO模式
Tomcat8之后,针对Http协议默认使用org.apache.coyote.http11.Http11NioProtocol,也就是NIO模式.通过之前的博客分析,我们知道Connector组件在 ...
- matlab 设置最大并行数_浅析线程池参数设置
背景 首先先明确一下线程池的主要作用是什么 线程池解决的核心问题就是资源管理问题.在并发环境下,系统不能够确定在任意时刻中,有多少任务需要执行,有多少资源需要投入.这种不确定性将带来以下若干问题: 频 ...
- 线程池大小设置,CPU的核心数、线程数的关系和区别,同步与堵塞完全是两码事
线程池应该设置多少线程合适,怎么样估算出来.最近接触到一些相关资料,现作如下总结. 最开始接触线程池的时候,没有想到就仅仅是设置一个线程池的大小居然还有这么多的学问,汗颜啊. 首先,需要考虑到线程池所 ...
- java线程池队列大小_GitHub - sunshanpeng/dark_magic: 合理估算线程池大小及队列数
合理估算java的线程池大小及队列数 原理分析 先来一个天真的估算方法:假设要求一个系统的TPS(Transaction Per Second或者Task Per Second)至少为20,然后假设每 ...
- 线程池大小设置和CPU核心数的关系
文章目录 1.线程池和CPU核心数的关系 2.常见概念:CPU的核心数,CPU的线程数 3.是否使用线程池就一定比使用单线程高效呢? 1.线程池和CPU核心数的关系 一般说来,大家认为线程池的大小经验 ...
- java线程池参数_java线程池参数设置原则,如何设置线程池参数比较合理?
线程池的参数应该怎样设置呢?相信对于很多的人来说这也是一个比较难的问题,下面就让我们一起来解决一下,究竟应该如何设置线程池的参数才是最合理的吧! 首先在设置参数的时候,有以下的几点是我们需要考虑到的! ...
- ThreadPoolExecutor使用和思考(上)-线程池大小设置与BlockingQueue的三种实现区别
前记: jdk官方文档(javadoc)是学习的最好,最权威的参考. 文章分上中下.上篇中主要介绍ThreadPoolExecutor接受任务相关的两方面入参的意义和区别,池大小参数corePoolS ...
- tomcat 查看当前请求数_原生线程池这么强大,Tomcat 为何还需扩展线程池?
前言 Tomcat/Jetty 是目前比较流行的 Web 容器,两者接受请求之后都会转交给线程池处理,这样可以有效提高处理的能力与并发度.JDK 提高完整线程池实现,但是 Tomcat/Jetty 都 ...
最新文章
- 【SeeMusic】视频编辑 ( 视频 X 坐标 | 视频 Y 坐标 | 视频旋转 | 视频扭曲 )
- NYOJ 595 乱七八糟
- Qt Linguist 开发人员 programmers
- Java5:BigInteger、BigDecimal详解
- 过山车99java游戏_过山车乐园游戏下载
- 【神经网络与深度学习】卷积神经网络在自然语言处理的应用
- 2014年武汉的IT行情好像不太好(续):20个月过后,再看当时面试过的几个公司--武汉财富基石-崩盘,辣妈萌宝-创业失败,朋友公司转交他人管理...
- 使用迅捷pdf虚拟打印机可以将excel转换成pdf文件吗?
- 急速微信开通过滤方法
- 加速度传感器灵敏度表示的几种方式LSB/g,count/g,V/g,V/°
- python前面三个大于号是啥_JavaScript 无符号位移运算符 三个大于号 的使用方法...
- maven手册(转)
- win10下OpenJtag驱动安装
- 毕业生最大感伤:穷!
- c语言五子棋存盘,C语言 五子棋(初学者版).doc
- 计算机二级是wpsoffice高级应用吗,考计算机二级ms office高级应用但是自己电脑上office软件都是wps 这和word ppt excel 软件有区别吗...
- 博客中的动态图片如何制作
- Java怎么做一个简单网页呢?
- 数字图像处理——第十章(图像分割)
- 美团王兴的创业三原则