利用CountDownLatch批量处理解决实际业务问题
一、背景
项目中发现针对批量网元回退时候,会出现性能问题,接口响应很慢。发现性能瓶颈在于数据规模比较大,SQL执行无性能问题,因此特意采用CountDownLatch多线程处理,提高接口响应速度。
二、实现
待处理数据量超过指定阈值,启用多线程分批处理
private void test(List<LineVo> lineList){// 数量阈值int maxShold = 2000;if(lineList.size() > maxShold){CountDownLatch countDownLatch = new CountDownLatch(lineList.size());// 线程小分组 int threadGroup = 20;// 默认最大线程数int defaultThread = 5;int maxThreadSize = Math.min(1+lineList.size()/threadGroup ,defaultThread);// 创建线程池ThreadPoolExecutor executor = new ThreadPoolExecutor(3, maxThreadSize , 10L, TimeUnit.MILLISECONDS,new LinkedBlockingQueue<>(lineList.size()),new ThreadPoolExecutor.CallerRunsPolicy());// 多线程处理for(Line line:lineList){ResultVo resultVo = new ResultVo();executor.execute(new ResultTask(line,resultVo,countDownLatch));// 父线程保存结果,避免同步问题resultVo.add(resultVo);}countDownLatch.await();executor.shutdown();// ResultVo有个isSuccess字段,记录成功标识if(resultList.stream().anyMatch(item -> !item.isSuccess())){// 任意线程失败,抛出异常}}}class ResultTask implements Runnable {private final Line line;private final ResultVo resultVo;private final CountDownLatch countDownLatch;public ResultTask (Line line,ResultVo resultVo,CountDownLatch countDownLatch){this.line = line;this.resultVo= resultVo;this.countDownLatch= countDownLatch;}@Overridepublic void run(){try{// 执行实际业务逻辑// 执行完毕,设置执行结果resultVo.setSuccess(true);}catch(Exception e){resultVo.setSuccess(false);}finaly{countDownLatch.countDown();}}}