报表业务通过线程池实现性能优化

在报表业务中,需统计多样业务,涉及多次不同或重复的查询。传统顺序查询模式对多线程硬件资源利用不足。现采用线程池实现多线程查询,以高效利用硬件资源,显著提升处理效率。
 

比如,需要按公司统计分析产品的销售情况

原业务逻辑

Long companyId = 1L;  //查询公司id为1的产品销售情况
List productList = queryProductByCompany(companyId);//查询产品列表

List productReportResult = new ArrayList<>();

//循环查询产品的销售情况
for (Product product : productList) {
    productReportResult.add(queryInfo(companyId, product));                 
}

//继续其他处理,按销售量排名

if(!CollectionUtils.isEmpty(productReportResult)) {
     productReportResult.sort((o1, o2) ->        o2.getTotal().compareTo(o1.getTotal()));
}

优化后逻辑(使用线程池)

//注入线程池
@Autowired
private ThreadPoolTaskExecutor threadPoolTaskExecutor;


...
...

Long companyId = 1L;  //查询公司id为1的产品销售情况
List productList = queryProductByCompany(companyId);//查询产品列表

List productReportResult = new ArrayList<>();

//线程计数器,用于记录所有线程执行完毕
CountDownLatch latch = new CountDownLatch(productList.size());

//循环查询产品的销售情况
for (Product product : productList) {
    threadPoolTaskExecutor.execute(() -> {
        productReportResult.add(queryInfo(companyId, product));  
        latch.countDown();
    });
                
}

//等待所有线程执行完毕
latch.await();

//继续其他处理,按销售量排名

if(!CollectionUtils.isEmpty(productReportResult)) {
     productReportResult.sort((o1, o2) ->        o2.getTotal().compareTo(o1.getTotal()));
}

你可能感兴趣的:(java,java,服务器,后端)