接口太慢,其中一种方式就是使用多线程进行快速处理。
介绍下,如何在项目中写代码的。
这里在for循环里使用调用,不是好方式,碍于接口只支持单个节点的查询。
private List<DeviceInfo> getDeviceByEmissionNoList(Long customerId, List<String> emissionSourceNoList) { List<DeviceInfo> deviceNoList = Lists.newArrayList(); CountDownLatch countDownLatch = new CountDownLatch(emissionSourceNoList.size()); for (String emissionSourceNo : emissionSourceNoList) { executor.submit(() -> { try { NodeInfo<Object, Object> nodeInfo = emissionSourceServiceFeign.queryDownVertex(DtoConvert.buildEmissionSourceVertexInfo(customerId, emissionSourceNo)); if (Objects.nonNull(nodeInfo)) { List<VertexInfo<Object>> nodes = nodeInfo.getNodes(); if (!CollectionUtils.isEmpty(nodes)) { nodes.forEach(node -> { if (Objects.equals(VertexLabelConstants.MONITOR, node.getLabel()) || Objects.equals(VertexLabelConstants.GOVERN, node.getLabel())) { LinkedHashMap deviceInfoMap = (LinkedHashMap) node.getNode(); if (Objects.nonNull(deviceInfoMap)) { DeviceInfo deviceInfo = (DeviceInfo) MetaClassUtil.mapToObj(deviceInfoMap, DeviceInfo.class); deviceInfo.setLabel(node.getLabel()); deviceNoList.add(deviceInfo); } } }); } } } finally { countDownLatch.countDown(); } }); } try { countDownLatch.await(); } catch (Exception e) { e.printStackTrace(); } return deviceNoList; }
注意点:
1.await放在外面
2.构造函数的size个数
3.countDown的时候,需要放在finally中
二:接口慢查
针对上面的这段查询,一般可以考虑三个方面的处理:
1.直接批量处理
2.多线程处理
3.查询完成后,使用缓存,但是需要看看是否是常变化的数据,缓存效果并不大。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)
2022-03-25 算法思想篇-递归