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

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

   // 创建一个固定大小的线程池
    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->映射门店id
                Map<String, List<String>> var1 = list.stream()
                        .filter(storeIdMap::containsKey) // 过滤掉不存在的 key
                        .collect(Collectors.toMap(key -> key, storeIdMap::get));
               //三方映射门店id
                List<String> idList = var1.values().stream()
                        .flatMap(List::stream) // 将每个 List<String> 扁平化为 Stream<String>
                        .collect(Collectors.toList());
                if (CollectionUtils.isEmpty(idList)) {
                    continue;
                }
                //转换大数据orgCode
                List<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.kler.cn/a/525119.html

相关文章:

  • C++中的类与对象(中)
  • WordPress event-monster插件存在信息泄露漏洞(CVE-2024-11396)
  • 大一计算机的自学总结:异或运算
  • wow-agent---task4 MetaGPT初体验
  • 危机13小时:追踪一场GitHub投毒事件
  • games101-作业2
  • 手写instanceof、手写new操作符
  • 多头潜在注意力(MLA):让大模型“轻装上阵”的技术革新——从DeepSeek看下一代语言模型的高效之路
  • python-leetcode-反转链表 II
  • vulfocus/thinkphp:6.0.12 命令执行
  • go-zero学习笔记(二)
  • Pyside的QWebEngineProfile类
  • OpenLayers知识总结1
  • 在Putty创建php文件
  • 安卓通过网络获取位置的方法
  • 透视B/S架构与C/S架构:构建未来网络应用的智慧选择
  • C27.【C++ Cont】时间、空间限制和STL库的简单了解
  • 跨境电商代购系统独立站深度分享
  • 【信息系统项目管理师-选择真题】2006下半年综合知识答案和详解
  • TVS选型设计
  • Android车机DIY开发之学习篇(六)编译讯为3568开发板安卓
  • 【Rust自学】17.1. Rust的面向对象的编程特性
  • EtherCAT主站IGH-- 20 -- IGH之fsm_pdo_entry.h/c文件解析
  • 【重生之我在学习C语言编译与链接详解】
  • ue5笔记(2)
  • OSCP:发送钓鱼电子邮件执行客户端攻击