背景:查询月统计数据,因为查询日统计数据功能已经实现。月统计数据,只是参一个List(date) 参数,for循环调用日统计,然后把结果整合就OK。
问题:单线程跑 太耗时间
解决方案:使用多线程,利用 ExcutorService 创建一个线程池,使用 CountDownLatch,来做 锁机制。
CountDownLatch的锁机制,可以访问:https://www.cnblogs.com/liun1994/p/7396026.html
下面是实例代码:
/** * 月 统计数据 * * @return * @Param */ @Override public ResultData<List<StatResultPo>> queryStatDataList(List<String> dateList) { ResultData<List<StatResultPo>> resultData = ResultData.built(); List<StatResultPo> list = new ArrayList<>(); /*StatResultPo statResultPo; for (String date : dateList) { statResultPo = processedStatData(date); list.add(statResultPo); }*/ //设置 线程锁 CountDownLatch cdl = new CountDownLatch(dateList.size()); //线程池 ExecutorService es1 = Executors.newFixedThreadPool(10); for (String date : dateList) { es1.execute(new Runnable() { @Override public void run() { list.add(processedStatData(date)); //每调用一次countDown()方法,在构造函数中初始化的count值就减1,当N个线程都调用了这个方法count的值等于0, //然后主线程就能通过await方法,恢复自己的任务。 cdl.countDown(); } }); } try { //恢复主线程 cdl.await(); } catch (InterruptedException e) { e.printStackTrace(); } /*Collections.sort(list, new Comparator<StatResultPo>(){ @Override public int compare(StatResultPo o1, StatResultPo o2) { //升序 return o1.getDate().compareTo(o2.getDate()); } });*/ Collections.sort(list, StatResultPo::compareTo); // 最终返回 resultData.success(list); return resultData; }