线程池(ExecutorService)初体验

背景:查询月统计数据,因为查询日统计数据功能已经实现。月统计数据,只是参一个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;
    }


原文地址:https://www.cnblogs.com/xinxin-ting/p/10650866.html