并发编程异步利器之CompletableFuture

 

目录

1:写在前头

2:实战环节

1:测试代码地址:

2:测试环节

3:对比数据分析

4:其他参数分析

3:总结


1:写在前头

我们在java的开发中是否会遇到处理大批量数据的问题,假如有这么一个场景,你去查询ES或者是DB,会给你返回大批量的数据,可能有十几万量级,甚至是百万量级,然后你拿着这些数据去做处理,操作可能包括cpu的复杂运算,文件存储,但不限于以上,那怎么办?还在使用for循环一个一个来?估计客户端就要超时了,恶心的一点情况是客户端设置了超时,然后再去拉一次/多次你的ES,或者是DB,然后第二天上班的时候,公司的网管会甩给你一个邮件,上面写道 “在今天早上凌晨3点多时候,持续了大约一个小时左右,某某机器上发生了cpu / io好像有点高呀,嗯   很是委婉的说。”那么这时候就要考虑下优化了,是否要使用线程池来解决这个问题,或者是异步。

2:实战环节

1:测试代码地址:

https://gitee.com/zccpojo/testcomfuture.git

可以调整如下两个参数来模拟

并发编程异步利器之CompletableFuture

2:测试环节

目前的测试参数设置为:任务数 2000个,每一个任务的处理时间的为10ms

1:同步:

花费总时间在 20479ms,并且都获取到全部到结果2000条

并发编程异步利器之CompletableFuture

2:异步:

花费总时间在 457ms,并且都获取到全部到结果2000条

并发编程异步利器之CompletableFuture

3:对比数据分析

同样是处理2000的条数,但是我们通过异步化的方式来处理,发现性能提升了  20479ms / 457ms  ~ 40倍,多么惊人的数据,看着都有点瑟瑟发抖,不过这个也和工作时长以及任务的个数有关系,如果任务个数更多的话,效果会更惊人。

4:其他参数分析

在上述的异步处理方式中,我们使用到了CompletableFuture,我们发现其传入了一个线程池,关于线程池的资料请移步

https://blog.csdn.net/weixin_45191798/article/details/100153524

https://blog.csdn.net/weixin_45191798/article/details/100159321

https://blog.csdn.net/weixin_45191798/article/details/100159830

TIPS:在使用的线程池的时候最好手动创建线程池(这里偷下懒),在使用完线程池后一定要手动关闭线程池,不要问为什么,问的就是《阿里巴巴开发手册》

3:总结

在做大量的数据处理的时候,可以考虑到缓存呀,二级缓存啊,甚至是客户端缓存以及必要的异步,本篇中介绍了采用异步+线程池的方式来处理大批量的数据,是可以降低RTT,提高系统的吞吐量的。源码分析会在后续中更新,也不早了,溜了。有兴趣的可以一起交流。