線程池(ExecutorService)初體驗

背景:查詢月統計數據,由於查詢日統計數據功能已經實現。月統計數據,只是參一個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;
    }
相關文章
相關標籤/搜索