【多线程的常见使用场景】
文章目录
- 多线程导出Excel的应用
- 业务中需要异步发送邮件、信息等场景
- 业务中解析对账文件
多线程导出Excel的应用
背景:随着数据订单量的增加,导出的数据量越来越大,单线程导出,对于少量数据,性能上的表现,还不是很明显,对于100万以上的数据,单线程导出,就会长时间的阻塞,甚至还会出现内存溢出的情况,导致用户体验比较差,因此我们需要考虑多线程同时进行查询,来保证我们的数据的性能提升。
前置条件:在考虑多线程导出,我们首先要考虑,我们的服务器的最大承载的数据量的大小,按照8核16G的服务器来说,我们新生代有5G的大小,因此eden区会有进4G的大小,按照每条数据生成的对象,占300字节,我们1G大概可以承载数据375万,因此,我们只需要考虑好分页,以及当前的线程数即可。
线程池设置:我们查询属于IO密集型,因此可以先设置基本的参数 核心线程数 32 最大线程数 64 阻塞队列 50 存活时间 30s 拒绝策略:取消当前任务:
分页:每条线程大概查询20万的数据即可,因此我们需要提前将总数查询出,这样给导出分配需要的线程数。
为了保证单个文件太大,导致打不开的情况,我们按照数据量分文件,每个文件20万,最后再考虑将所有的文件合并压缩,返回给用户。
业务中需要异步发送邮件、信息等场景
背景:在一些业务场合中,如果我们在操作一些业务时,需要发送邮件或者短信告知用户,又不想阻塞当前主线程的执行,此时我们需要异步的执行一些邮件发送或者短信发送。
注解@Async
在 Spring Boot 中,@Async 注解的默认线程池核心线程数是 8。这是 Spring Boot 自动配置的默认行为,具体细节如下:
默认线程池配置(Spring Boot 2.x/3.x)
配置项 默认值
核心线程数 8 (spring.task.execution.pool.core-size)
最大线程数 Integer.MAX_VALUE (无上限)
队列容量 Integer.MAX_VALUE (无界队列)
此线程池配置可能有内存溢出的情况,因此我们需要修改其参数,来保证任务的执行。
业务中解析对账文件
背景:对账文件,结算机构会以机构号为标准,会以zip的压缩文件发送到服务器上,我们需要将对账文件中的内容解析,落到本地的磁盘。因此需要多线程来进行解析,提升文件解析的时间,保证我们的内容更快地解析完成。
注意点:
1.文件内容的数量,保证内存不溢出的情况下,多线程解析文件,将文件内容落磁盘。
2.考虑线程池的配置,核心线程池,最大线程池,阻塞队列,存活时间,线程工厂,拒绝策略等。
3.使用CountDownLatch,来计数保证所有的线程文件解析完成后,再考虑进行下面的业务。