最近项目在做excel导出时,需要设置从数据库查询出来的某个字段的值。由于数据量较大,经常出现导出时响应太慢的问题。所以打算用多线程优化一下。
我在本地做了一个实验,先在数据库中,插入10万条数据。然后分别测试量3种情况:
1.不使用多线程直接单线程修改
测试来一下时间大概是9秒
2.使用普通线程池+countdownLatch(这个也是项目中以前的用法)
看了一下时间大概是6s多
3.使用forkAndJoin框架
相信大家已经看出来了,普通线程池+countDownLatch的缺点在于,每个线程执行完成之后调用countDownLatch.await()方法会被阻塞。而forkAndJoin就不同了,该线程池使用的是工作窃取机制,每个线程执行完自己的任务之后会从队列的末尾(该线程池将任务放在队列中)获取任务来执行。比阻塞线程效率理论上来的高(注意:仅仅是理论上),代码太长大家自己去我的github看吧需要重点注意的是阈值的选取,这个是提高效率的关键。我试了很多次,最终将时间降为4s