Executors线程

线程池ThreadPoolExecutor–Executors.newFixedThreadPool()

创建获取

ExecutorService queryWorker = Executors.newFixedThreadPool(6);

上面的是创建固定条数的线程池,按照阿里手册是不允许的,不过目前并无异常,如有代码规范检查,可以使用下面这个手动创建的。


ThreadPoolExecutor queryWorker = new ThreadPoolExecutor(6,12,10,TimeUnit.SECONDS,new LinkedBlockingDeque<>(10000),Executors.defaultThreadFactory(),new ThreadPoolExecutor.AbortPolicy());

线程池不允许使用 Executors 去创建,而是通过 ThreadPoolExecutor 的方式。
Executors 返回的线程池对象的弊端如下:

  • FixedThreadPool 和 SingleThreadPool:
    允许的请求队列长度为Integer.MAX_VALUE,可能会堆积大量的请求,从而导致OOM。
  • CachedThreadPool:
    允许的创建线程数量为 Integer.MAX_VALUE,可能会创建大量的线程,从而导致OOM。

DEMO

/**
 * @desc 搜索公司及相关
 * @param comAndProRequest //接收参数
 * @return
 */
@RequestMapping(value = "/test", method = RequestMethod.POST)
public ResultValue queryComAndPro(@RequestBody ComAndProRequest comAndProRequest) {
    logger.info("===[HealthAppCompanyController.queryComAndPro]===start===");
    ResultValue resultValue = new ResultValue();
    try{
        Map map = new HashMap();
        CountDownLatch countDownLatch = new CountDownLatch(5);
        if(comAndProRequest != null){
            //获取
            queryWorker.execute(()->{
                    try{
                        HealthCompanyDTO companyDTO = new HealthCompanyDTO();
                        companyDTO.setComName(comAndProRequest.getQueryText());
                        ResultValue comValue = healthCompanyService.searchCompany(companyDTO);
                        //Map comMap = (Map) comValue.getContent();
                        Map<String,Object> m = new HashMap<>();
                        m.put("company",comValue.getContent());
                        m.put("total",comValue.getTotal());
                        //转化到结果Map
                        Map<String,Object> comResultMap = new HashMap<>();
                        comResultMap.put("companyList",m.get("company"));
                        comResultMap.put("companySize",m.get("total"));
                        map.put("company",comResultMap);
                        countDownLatch.countDown();
                    }catch (Exception e){
                        logger.error("***[HealthAppCompanyController.queryComAndPro.companyWork::ERROR]:",e);
                    }
                }
            );
            //获取产品列表
            queryWorker.execute(() ->{
                    HealthCompanyPro companyPro = new HealthCompanyPro();
                    companyPro.setProName(comAndProRequest.getQueryText());
                    List<HealthCompanyPro> productList = healthCompanyProService.searchCompanyPro(companyPro);
                    Integer total = productList.size();
                    //转化到结果Map
                    Map<String,Object> proResultMap = new HashMap<>();
                    proResultMap.put("productList",productList);
                    proResultMap.put("productSize",total);
                    map.put("product",proResultMap);
                    countDownLatch.countDown();
                }
            );
            //获取活动列表
            queryWorker.execute(() -> {
                    HealthActive healthActive = new HealthActive();
                    healthActive.setName(comAndProRequest.getQueryText());
                    List<HealthActive> activelist = healthActiveMapper.searchActive(healthActive);
                    Integer total =activelist.size();
                    //转化到结果Map
                    Map<String,Object> proResultMap = new HashMap<>();
                    proResultMap.put("activelist",activelist);
                    proResultMap.put("activeSize",total);
                    map.put("active",proResultMap);
                    countDownLatch.countDown();
                }
            );
            //直播搜索
            queryWorker.execute(() ->{
                    HealthLiveDTO liveDTO = new HealthLiveDTO();
                    liveDTO.setZbName(comAndProRequest.getQueryText());
                    ResultValue resultValue1 = healthLiveService.searchLive(liveDTO);
                    Integer total =resultValue.getTotal();
                    //转化到结果Map
                    Map<String,Object> proResultMap = new HashMap<>();
                    proResultMap.put("liveList",resultValue1.getContent());
                    proResultMap.put("livelSize",total);
                    map.put("Live",proResultMap);
                    countDownLatch.countDown();
                }
            );
            //搜索新闻
            queryWorker.execute(()-> {
                    HealthForumTypeDTO healthForumTypeDTO = new HealthForumTypeDTO();
                    healthForumTypeDTO.setValue(comAndProRequest.getQueryText());
                    List<HealthForumTypeDTO> HealthForumTypelist = HealthForumTypeService.searchForum(healthForumTypeDTO);
                    Integer total =HealthForumTypelist.size();
                    //转化到结果Map
                    Map<String,Object> proResultMap = new HashMap<>();
                    proResultMap.put("HealthForumTypelist",HealthForumTypelist);
                    proResultMap.put("HealthForumTypeSize",total);
                    map.put("HealthForumType",proResultMap);
                    countDownLatch.countDown();
                }
            );

            countDownLatch.await();
        }
        resultValue.setSuccess(true);
        resultValue.setContent(map);
    }catch (Exception e){
        logger.error("***[HealthAppCompanyController.queryComAndPro::ERROR]:",e);
        resultValue.setSuccess(false);
        resultValue.setMessage("搜索企业及产品异常");
    }
    logger.info("======end===");
    return resultValue;
}

参考源自:https://blog.csdn.net/qq_28042463/article/details/108090315

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值