线程池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