【多线程实例】
使用场景
拿到了一个商品的list,然后要循环list去获取每个商品的明细,由于调用api很依赖于网络,一个个执行速度慢,所以考虑使用线程去解决。
//根据机器id 获取 所有商品信息
public List<ProductResponse> productList(MachineConfigRequest.Code request) {//一次性查询数据库机器对应的商品listBoolQuery boolQuery = new BoolQuery();List<Query> queryList = new ArrayList<>();TermQuery termQuery1 = new TermQuery();termQuery1.setFieldName(ProductListConfigEnum.MACHINE_ID.getValue());termQuery1.setTerm(ColumnValue.fromString(request.getMachine_id()));queryList.add(termQuery1);boolQuery.setMustQueries(queryList);MachineCommonTableStore tableStore = new MachineCommonTableStore();SearchQuery searchQuery = new SearchQuery();searchQuery.setQuery(boolQuery);List<ProductResponse> searchResponse = tableStore.getRowList(searchQuery, ProductResponse.class, ModelEnum.PRODUCT_LIST.getModel(), ModelEnum.PRODUCT_LIST_INDEX.getModel());//根据机器id 和 获取所有的货道信息 key:slot value productInfoMap<String, ProductSlotInfo> map = this.getSlotInfo(request.getMachine_id());//转换为 key:productId value:slotListMap<String, List<ProductSlotInfo>> productSlotMap = this.getProductSlotList(map);//不需要更新货架图 直接返回库里面存的if (request.getLabel() == 0) {searchResponse.forEach(productResponse -> {//根据商品ID获取商品对应的货道listList<ProductSlotInfo> productSlotInfos = productSlotMap.get(productResponse.getProduct_id());//塞货道信息和库存this.setSlotAndQuantity(productResponse, productSlotInfos);});return searchResponse.parallelStream().sorted(Comparator.comparing(ProductResponse::getSlot_info)).collect(Collectors.toList());}//根据机器id 调用API 获取所有商品idMachineService service = new MachineService();List<ProductResponse> list = service.getProductInventory(request.getMachine_id(), ProductResponse.class);//循环对比 把之前已经配置过赏级的商品的id和赏级塞进去list.forEach(response -> searchResponse.stream().filter(row -> response.getProduct_id().equals(row.getProduct_id())).forEach(row -> {response.setId(row.getId());response.setMarket(row.getMarket());}));List<ProductResponse> responseList = Lists.newArrayList();if (CollectionUtils.isNotEmpty(list)) {ThreadPoolExecutor pool = new ThreadPoolExecutor(50, 50, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<>(100), (r, executor) -> {try {executor.getQueue().put(r);} catch (InterruptedException e) {e.printStackTrace();}});list.forEach(response -> pool.submit(() -> {//调用API 获取商品信息JSONObject object = new JSONObject();object.put(CeresonApiEnum.product_id.getValue(), response.getProduct_id());String json = RobotShopClient.callApiGet(CallMachineShopApiConstants.GET_PRODUCT_BY_ID, object.toJSONString());JSONObject jsonObject = JSON.parseObject(json);String data = jsonObject.getString(CeresonApiEnum.data.getValue());JSONObject js = JSON.parseObject(data);String productStr = js.getString(CeresonApiEnum.product.getValue());//把API获取的商品信息转换为ObjProductResponse productResponse = JSON.parseObject(productStr, ProductResponse.class);//根据商品ID获取商品对应的货道listList<ProductSlotInfo> productSlotInfos = productSlotMap.get(response.getProduct_id());//塞货道信息和库存this.setSlotAndQuantity(productResponse, productSlotInfos);responseList.add(productResponse);}));boolean allThreadsIsDone = pool.getTaskCount() == pool.getCompletedTaskCount();while (!allThreadsIsDone) {allThreadsIsDone = pool.getTaskCount() == pool.getCompletedTaskCount();}pool.shutdown();}return responseList.parallelStream().sorted(Comparator.comparing(ProductResponse::getSlot_info)).collect(Collectors.toList());
}
public PageResponse<AuctionListByUserIdResponse> getAuctionListByUserId(AuctionRequest.GetAuctionByUserId request) {AuctionTableStore auctionTableStore = new AuctionTableStore();List<Query> list = new ArrayList<>();BoolQuery boolQuery = new BoolQuery();BoolQuery shouldQuery = new BoolQuery();List<Sort.Sorter> sorter = TableStoreTemplate.getSorter(request.getSort());PageResponse<AuctionListByUserIdResponse> pageResponse = new PageResponse<>();try {pageResponse = auctionTableStore.queryAll(request.getNextToken(), sorter, boolQuery, request.getLimit(),AuctionListByUserIdResponse.class);} catch (Exception e) {log.error("getAuctionList failed exception = {}", e);throw new BaseException(ResponseCode.Bad_Request.getCode(), "查询失败!");}List<AuctionListByUserIdResponse> auctionListByUserIdResponses = pageResponse.getData();if (null != auctionListByUserIdResponses && auctionListByUserIdResponses.size() > 0) {ThreadPoolExecutor pool = new ThreadPoolExecutor(auctionListByUserIdResponses.size(), auctionListByUserIdResponses.size(), 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<>(), new RejectedExecutionHandler() {@Overridepublic void rejectedExecution(Runnable r, ThreadPoolExecutor executor) {try {executor.getQueue().put(r);} catch (InterruptedException e) {e.printStackTrace();}}});String robotSign = "##robot";auctionListByUserIdResponses.forEach(response -> {pool.submit(new Runnable() {@Overridepublic void run() {String sellerId = response.getSellerId();String buyerId = response.getBuyerId();String auctionId = response.getId();String twr = "";/* 处理是否为机器人 robotSign */if (buyerId.endsWith(robotSign) || sellerId.endsWith(robotSign)) {twr = "是";} else {twr = "否";}response.setWhetherRobot(twr);response.setAuctionGoodsList(getGoodsRangeByAuctionId(sellerId, auctionId, DeleteFlagEnum.DELETE));response.setAuctionBidGoodsList(getGoodsRangeByAuctionId(buyerId, auctionId, DeleteFlagEnum.DELETE));response.setCostPrice(getTotalCostPrice(response.getAuctionGoodsList()));}});});boolean allThreadsIsDone = pool.getTaskCount() == pool.getCompletedTaskCount();while (!allThreadsIsDone) {allThreadsIsDone = pool.getTaskCount() == pool.getCompletedTaskCount();}pool.shutdown();}for (AuctionListByUserIdResponse info : pageResponse.getData()){System.out.println(info.getTransactionPrice() + "," + info.getCostPrice());}return pageResponse;
}
相关文章:
【多线程实例】
使用场景 拿到了一个商品的list,然后要循环list去获取每个商品的明细,由于调用api很依赖于网络,一个个执行速度慢,所以考虑使用线程去解决。 //根据机器id 获取 所有商品信息 public List<ProductResponse> productList(MachineConf…...
数据治理在数据提取中的角色:确保数据质量和安全
在数字化浪潮中,数据已成为企业运营和决策的核心驱动力。然而,随着数据量的快速增长和来源的多样化,如何确保所提取数据的质量和安全性成为企业面临的重大挑战。数据治理,作为一种系统的管理方法,在数据提取过程中扮演…...

Nuxt快速学习开发 - Nuxt3静态资源Assets
Nuxt 使用两个目录来处理样式表、字体或图像等资产。 public/目录内容按原样在服务器根目录中提供。 assets/目录包含您希望构建工具(Vite 或 webpack)处理的所有资产。 public/目录 public目录用作静态资产的公共服务器,可在您的应用程序定…...

为什么企业需要数据挖掘平台?哪个比较好呢?
什么是数据挖掘? 数据挖掘就是从大量的数据中去发现有用的信息,然后根据这些信息来辅助决策。听起来是不是跟传统的数据分析很像呢?实际上,数据挖掘就是智能化的数据分析,它们的目标都是一样的。但是,…...

leetCode-hot100-链表专题
leetCode-hot100-链表专题 链表简介单链表单链表的使用例题206.反转链表19.删除链表的倒数第N个结点24.两两交换链表中的节点25.K个一组翻转链表 双向链表双向链表的使用 循环链表61.旋转链表141.环形链表142.环形链表Ⅱ LinkedListLinkedList的使用 链表简介 参考博客&#x…...

【ai】tx2-nx:配置tritonserver2.17.0-jetpack4.6 环境并运行例子
2.17.0 for jetpack 4.6运行需要 如果在jetson上构建Triton : Note: When building Triton on Jetson, you will require a newer version of cmake. We recommend using cmake 3.21.0. Below is a script to upgrade your cmake version to 3.21.0. You can use cmake 3.18.4…...
Spring和Spring Boot常用注解介绍及使用
Spring和Spring Boot框架通过丰富的注解集简化了Java开发,使得配置更加简洁且易于理解。 下面是一些常用的Spring和Spring Boot注解及其使用方式的简介: 目录 1. Component 2. Service 3. Repository 4. Controller 5. RestController 6. Autowire…...

【计算机毕业设计】211校园约拍微信小程序
🙊作者简介:拥有多年开发工作经验,分享技术代码帮助学生学习,独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。🌹赠送计算机毕业设计600个选题excel文件,帮助大学选题。赠送开题报告模板ÿ…...

笨蛋学算法之LeetCodeHot100_1_两数之和(Java)
package com.lsy.leetcodehot100;public class _Hot1_两数之和 {//自写方法public static int[] twoSum1(int[] nums, int target) {//定义存放返回变量的数组int[] arr new int[2];//遍历整个数组for (int i 0; i < nums.length; i) {//从第二个数开始相加判断for (int j…...
用ip link add link命令创建vlan子设备
用ip link add link命令创建vlan子设备 ip link add link 命令用于在 Linux 系统中创建网络设备,其中可以用它来创建 VLAN (Virtual Local Area Network) 子接口,这是一个典型的用法。 VLAN是一种在二层网络(即数据链路层)上区分…...

AD复用布局布线
在用AD软件绘制PCB时,如果有多个部分布线相同,则可以使用复用布局布线功能,加快并且方便PCB的绘制。 一、创建Room 1、绘制好的电路图创建Room 2、需要拷贝的电路图创建Room 二、PCB List操作 1、PCB List内设置 2、复制绘制完的线路图 3、…...

【深度学习驱动流体力学】采集OpenFOAM仿真的流体力学数据送入到强化学习DQN模型训练
目录 技术原理1. 数据准备与环境构建2. DQN模型的设计与训练3. 训练过程中的监控与可视化训练记录参考技术原理 1. 数据准备与环境构建 首先,数据从VTK文件中读取并处理,这些文件包含流体速度场数据。通过PyVista库提取速度场信息,并将其存储在NumPy数组中。数据集随后被划…...
国内公开数据
以下是一些关于国内政府部门公布的数据或互联网上开放数据的资源,包括CSV、JSON和Parquet格式: 国内政府部门公开数据 中国政府数据开放平台 链接: 数据开放平台概要: 提供来自中国各级政府的公开数据集,数据格式包括CSV、JSON等。 上海市公…...
QT QByteArray 的用法
QByteArray 是 Qt 中用于处理原始字节数据的类,类似于标准库中的 std::vector<char> 或 std::string,但具有更多适合Qt框架的功能。它可以用来处理文本和二进制数据,并提供了一些方便的方法进行数据操作。下面是一些常见的用法示例&…...

InPixio Photo Cutter v10 解锁版安装教程 (懒人抠图工具)
前言 InPixio Photo Cutter是一款懒人抠图工具,采用了增强的算法切割技术,可以在不影响图像质量的情况下,允许用户从照片中删除任何物体或人物,并且保持其完整的质量。你只需点击几下鼠标,便可从照片中剪下任何细节、…...

Java17 --- SpringSecurity之OAuth2
一、OAuth2 1.1、使用github以授权码方式 1.1.1、注册应用程序 1.1.2、测试代码 pom依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-oauth2-client</artifactId></dependency> spring…...
服务器上线的一些事
最近不少人在上线上遇到问题 对于最近的上戏 进行一个坑或操作步骤的总结 以及遇到这些之后如何做 关于选项的选择 1 对于是否要在一个小时前释放 这个是看个人的 2 对于选择一台服务器还是两台呢?这个是最后限制 一台 这个免费的服务器 是有一个两百的额度的 选择…...
OceanBase-docker安装、连接数据库、修改mysql用户密码
OceanBase-docker安装、连接数据库、修改mysql用户密码 安装拉取镜像开启容器验证 连接数据库1.直接连接的方式修改数据库密码2.先进入镜像再连接数据库的方式进入镜像无密码有秘密 本人使用docker安装的oceanbase 安装 拉取镜像 docker pull oceanbase/oceanbase-ce:3.1.4 …...
浪潮(Inspur)服务器硬件监控指标解读
随着企业业务的快速发展,服务器的稳定运行成为保障业务连续性的关键。浪潮(Inspur)服务器以其卓越的性能和稳定性,在数据中心中扮演着重要角色。 为了确保服务器的稳定运行,监控易作为一款专业的IT基础设施监控软件&am…...
极简opencv操作xml文件
目标 修改xml文件,先产生一个临时文件,拷贝,修改,改名,使用opencv 非常简单地就可以搞定配置xml文件 code #include <opencv2/opencv.hpp> #include <iostream> #include <opencv2/core/utils/files…...
【Java学习笔记】Arrays类
Arrays 类 1. 导入包:import java.util.Arrays 2. 常用方法一览表 方法描述Arrays.toString()返回数组的字符串形式Arrays.sort()排序(自然排序和定制排序)Arrays.binarySearch()通过二分搜索法进行查找(前提:数组是…...

【项目实战】通过多模态+LangGraph实现PPT生成助手
PPT自动生成系统 基于LangGraph的PPT自动生成系统,可以将Markdown文档自动转换为PPT演示文稿。 功能特点 Markdown解析:自动解析Markdown文档结构PPT模板分析:分析PPT模板的布局和风格智能布局决策:匹配内容与合适的PPT布局自动…...

【Java_EE】Spring MVC
目录 Spring Web MVC 编辑注解 RestController RequestMapping RequestParam RequestParam RequestBody PathVariable RequestPart 参数传递 注意事项 编辑参数重命名 RequestParam 编辑编辑传递集合 RequestParam 传递JSON数据 编辑RequestBody …...
全面解析各类VPN技术:GRE、IPsec、L2TP、SSL与MPLS VPN对比
目录 引言 VPN技术概述 GRE VPN 3.1 GRE封装结构 3.2 GRE的应用场景 GRE over IPsec 4.1 GRE over IPsec封装结构 4.2 为什么使用GRE over IPsec? IPsec VPN 5.1 IPsec传输模式(Transport Mode) 5.2 IPsec隧道模式(Tunne…...

如何理解 IP 数据报中的 TTL?
目录 前言理解 前言 面试灵魂一问:说说对 IP 数据报中 TTL 的理解?我们都知道,IP 数据报由首部和数据两部分组成,首部又分为两部分:固定部分和可变部分,共占 20 字节,而即将讨论的 TTL 就位于首…...

Springboot社区养老保险系统小程序
一、前言 随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱,社区养老保险系统小程序被用户普遍使用,为方…...

【JVM面试篇】高频八股汇总——类加载和类加载器
目录 1. 讲一下类加载过程? 2. Java创建对象的过程? 3. 对象的生命周期? 4. 类加载器有哪些? 5. 双亲委派模型的作用(好处)? 6. 讲一下类的加载和双亲委派原则? 7. 双亲委派模…...
DAY 26 函数专题1
函数定义与参数知识点回顾:1. 函数的定义2. 变量作用域:局部变量和全局变量3. 函数的参数类型:位置参数、默认参数、不定参数4. 传递参数的手段:关键词参数5 题目1:计算圆的面积 任务: 编写一…...
规则与人性的天平——由高考迟到事件引发的思考
当那位身着校服的考生在考场关闭1分钟后狂奔而至,他涨红的脸上写满绝望。铁门内秒针划过的弧度,成为改变人生的残酷抛物线。家长声嘶力竭的哀求与考务人员机械的"这是规定",构成当代中国教育最尖锐的隐喻。 一、刚性规则的必要性 …...
【大厂机试题解法笔记】矩阵匹配
题目 从一个 N * M(N ≤ M)的矩阵中选出 N 个数,任意两个数字不能在同一行或同一列,求选出来的 N 个数中第 K 大的数字的最小值是多少。 输入描述 输入矩阵要求:1 ≤ K ≤ N ≤ M ≤ 150 输入格式 N M K N*M矩阵 输…...