当前位置: 首页 > news >正文

多线程执行大批量数据查询

   // 创建一个固定大小的线程池ExecutorService executorService = Executors.newFixedThreadPool(5);// 创建多个查询任务List<Callable<List<ShopCompareBase>>> tasks = new ArrayList<>();//查询门店 切割,分成十份List<List<String>> shopIdList = averageAssign(reqShopCodes, 10);if (CollectionUtils.isNotEmpty(shopIdList)) {for (List<String> list : shopIdList) {if (CollectionUtils.isNotEmpty(list)) {//xgj->映射门店idMap<String, List<String>> var1 = list.stream().filter(storeIdMap::containsKey) // 过滤掉不存在的 key.collect(Collectors.toMap(key -> key, storeIdMap::get));//三方映射门店idList<String> idList = var1.values().stream().flatMap(List::stream) // 将每个 List<String> 扁平化为 Stream<String>.collect(Collectors.toList());if (CollectionUtils.isEmpty(idList)) {continue;}//转换大数据orgCodeList<String> shopIds = dimMchtHllShopDfService.convertShopId2OrgCode(idList, new ArrayList<>());BusinessDataTendencyRequest req = new BusinessDataTendencyRequest();BeanUtils.copyProperties(request, req);req.setShopIDs(shopIds);storeRankList.addAll(getStoreRank(req));Long t1 = System.currentTimeMillis();log.info("getRealTimeDateBatchQuery.start:{}", System.currentTimeMillis());//多任务执行tasks.add(()-> {StoreBusinessContrastReqDto storeBusinessContrastReqDto = new StoreBusinessContrastReqDto();BeanUtils.copyProperties(request, storeBusinessContrastReqDto);storeBusinessContrastReqDto.setShopIDs(shopIds);return hisOrderRealTimeDataService.getRealTimeDateBatchQuery(dataType, storeBusinessContrastReqDto, request.getIsHomepage());});Long t2 = System.currentTimeMillis();log.info("getRealTimeDateBatchQuery.end 耗时:{}s", (t2 - t1) / 1000.0);}}}try {// 提交所有任务并等待它们完成List<Future<List<ShopCompareBase>>> futures = executorService.invokeAll(tasks);// 获取每个任务的结果for (Future<List<ShopCompareBase>> future : futures) {shopCompareBaseList.addAll(future.get());}} catch (InterruptedException | ExecutionException e) {e.printStackTrace();} finally {// 关闭线程池executorService.shutdown();}
}

/*** 将一个list均分成n个list,主要通过偏移量来实现的** @param source* @return*/
public static <T> List<List<T>> averageAssign(List<T> source, int n) {if(CollectionUtils.isEmpty(source)) return  null;List<List<T>> result = new ArrayList<List<T>>();int remaider = source.size() % n; //(先计算出余数)int number = source.size() / n; //然后是商int offset = 0;//偏移量for (int i = 0; i < n; i++) {List<T> value = null;if (remaider > 0) {value = source.subList(i * number + offset, (i + 1) * number + offset + 1);remaider--;offset++;} else {value = source.subList(i * number + offset, (i + 1) * number + offset);}result.add(value);}return result;
}
http://www.lryc.cn/news/526222.html

相关文章:

  • ChatGPT高效处理图片技巧使用详解
  • leetcode——相交链表(java)
  • RubyFPV开源代码之系统简介
  • 麦田物语学习笔记:创建TransitionManager控制人物场景切换
  • 后端SpringBoot学习项目-用户管理-增删改查-service层
  • 机器学习11-学习路径推荐
  • [ACTF2020 新生赛]Upload1
  • 【PyTorch】0.初识:从吃货角度理解张量
  • 医学图像分析工具09.1:Brainstorm安装教程
  • springboot基于Spring Boot的智慧养老服务系统的设计与实现
  • Linux内核中IPoIB驱动模块的初始化与实现
  • WPS计算机二级•幻灯片的基础操作
  • .NET9增强OpenAPI规范,不再内置swagger
  • 基于微信小程序的民宿预订管理系统
  • 网络(三) 协议
  • 【深度解析Java 20天速成】04_IDEA的安装与使用
  • gitlab处理空文件夹的提交或空文件夹提交失败
  • 计算机网络之链路层
  • Arduino大师练成手册 -- 读取红外接收数据
  • 【Efficient AIGC】SiTo: Similarity-based Token Pruning (AAAI-2025)
  • 数据标注开源框架 Label Studio
  • MyBatis最佳实践:MyBatis 框架的缓存
  • 基于LangGraph、Groq和Tavily打造可以调用外部搜索引擎工具的对话机器人(核心代码 万字详解)
  • 衡量算法性能的量级标准:算法复杂度
  • PHP校园助手系统小程序
  • 如何在Spring Boot项目中高效集成Spring Security
  • 【PostgreSQL内核学习 —— (WindowAgg(一))】
  • PAT甲级-1020 Tree Traversals
  • LVGL+FreeRTOS实战项目:智能健康助手(Max30102篇)
  • 人脸识别【python-基于OpenCV】