背景:查詢月統計數據,由於查詢日統計數據功能已經實現。月統計數據,只是參一個List(date) 參數,for循環調用日統計,而後把結果整合就OK。html
問題:單線程跑 太耗時間多線程
解決方案:使用多線程,利用 ExcutorService 建立一個線程池,使用 CountDownLatch,來作 鎖機制。ide
CountDownLatch的鎖機制,能夠訪問:https://www.cnblogs.com/liun1994/p/7396026.html函數
下面是實例代碼:ui
/** * 月 統計數據 * * @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; }