我先说一下我们公司(某金融公司)的这个需求吧,最近预授信项目要上线了,作为公司实习生的我肯定不能参与核心业务,于是给我分配了这样一个需求。

上传Excel文件,并解析Excel里面的数据,判断userId是否存在,是否存在额度申请,是否存在借款申请,是否存在额度账户,这些都没有的话,判定导入用户有效。

1、上传文件,这个简单一些,直接使用公司自己封装的框架,把文件上传到配置文件配置的路径。下载就是反过来,通过前端传来的地址,去dfs拉取文件。

2、解析过程是在提交授信申请的时候触发, 上传的excel可能会出现导入大量用户(破万)的情况,所以如果是单线程同步处理,可能一小时也处理不完。因为解析一次需要的判断逻辑很多,中间调用了很多dubbo接口,网络延迟是必然的。

有两种方案: 一、使用跑批任务定时拉取申请授信的数据,然后异步处理。  二、使用多线程解析Excel

第一种也可以,但是需要改动其他项目的代码,使得系统复杂度增加。

这里使用了第二种 ,代码如下

    @Overridepublic List<Map<String, Integer>> deal(List<Map<Integer, String>> list, String bitchId, String name) {final int THREAD_NUM = 100;ExecutorService executorService = Executors.newFixedThreadPool(THREAD_NUM);List<Future<Map<String, Integer>>> futures = new ArrayList<>(THREAD_NUM);List<Map<String, Integer>> maps = new ArrayList<>();int size = list.size();for (int i = 0; i < THREAD_NUM; i++) {List<Map<Integer, String>> subList = (i == THREAD_NUM - 1) ? list.subList(size / THREAD_NUM * i, list.size()): list.subList(size / THREAD_NUM * i, size / THREAD_NUM * (i + 1));DealCallable dealCallable = new DealCallable();dealCallable.setThreadNum(i);dealCallable.setBitchId(bitchId);dealCallable.setUserName(name);dealCallable.setBasPreApprovalService(this);dealCallable.setList(subList);futures.add(executorService.submit(dealCallable));}for (Future<Map<String, Integer>> future : futures) {try {maps.add(future.get());} catch (Exception e) {log.info("线程处理错误", e);}}executorService.shutdown();return maps;}
DealCallable这个类是自定义的,继承了Callable接口,并且重写了call()方法,返回解析的数据,代码如下
@Data
public class DealCallable implements Callable<Map<String, Integer>> {private int threadNum;private String bitchId;private String userName;private BasPreApprovalService basPreApprovalService;private List<Map<Integer, String>> list;@Overridepublic Map<String, Integer> call() throws Exception {return basPreApprovalService.analysis(list, bitchId, userName, threadNum);}
}

面试必问系列:5、知道多线程吗?谈谈你参与过的多线程实战场景相关推荐

  1. 面试必问系列之在浏览器中输入URL后到网页显示 其间发生了什么?

    文章目录 @[TOC](文章目录) 1:解析URL网址,从而生成发送给Web服务器的Http请求信息 2:真实地址查询-----(DNS域名解析) 3:调用协议栈 4:可靠的传输 TCP 5:远程定位 ...

  2. Android面试必问!2021最新中高阶Android面试题总结,理论+实战双管齐下!

    前言 金九银十面试季,相信大家肯定急需一套Android面试宝典,今天小编就给大家准备了我珍藏已久的Android高阶面试宝典,一份超级详细的Android面试必备知识点,供大家学习 ! 想必每一个安 ...

  3. 面试必问!多线程并发问题

    多线程并发问题,基本是面试必问的. 大部分同学应该都知道Synchronized,Lock,部分同学能说到volatile.并发包,优秀的同学则能在前面的基础上,说出Synchronized.vola ...

  4. 线程同步有几种方法_架构师面试必问的多线程状态切换及常用方法

    架构师面试必问的多线程状态切换及常用方法 一.问题背景 Java架构师面试中,多线程状态切换及常用方法几乎是必问的,要掌握创建多线程的方式和方法. 二.创建多线程的几种方式 2.1方式一继承Threa ...

  5. 面试必问:多线程与线程池

    前言 前几章都在讲一些锁的使用和原理,主要是为了保证多线程情况下变量的原子性,但这并不是说多线程不好,合理利用还是有好处的.至于什么好处,看下面内容就懂了,先打个比方吧(谁叫比方,上来挨打):假如你体 ...

  6. 面试必会系列 - 1.6 Java 垃圾回收机制

    本文已收录至 Github(MD-Notes),若博客中有图片打不开,可以来我的 Github 仓库:https://github.com/HanquanHq/MD-Notes,涵盖了互联网大厂面试必 ...

  7. 互联网公司面试必问的mysql题目(下)

    这是mysql系列的下篇,上篇文章地址我附在文末. 什么是数据库索引?索引有哪几种类型?什么是最左前缀原则?索引算法有哪些?有什么区别? 索引是对数据库表中一列或多列的值进行排序的一种结构.一个非常恰 ...

  8. 面试必会系列 - 5.3 LVS负载均衡

    本文已收录至 Github(MD-Notes),若博客中图片模糊或打不开,可以来我的 Github 仓库,包含了完整图文:https://github.com/HanquanHq/MD-Notes,涵 ...

  9. 面试必会系列 - 11.1 一文读懂Maven:Maven工程类型、项目结构、工程关系、常见命令等

    本文已收录至 Github(MD-Notes),若博客中图片模糊或打不开,可以来我的 Github 仓库,包含了完整图文:https://github.com/HanquanHq/MD-Notes,涵 ...

最新文章

  1. 使用Masonry实现UILabel和UIIMageView自适应长度居中
  2. 转载:如何避免代码中的if嵌套
  3. DWM1000 长距离模块讨论
  4. python自带的shell是什么-python shell是什么东西?
  5. 图像添加柯西分布噪声
  6. 通过路由进行参数的传递(方法一)
  7. 夯实基础——P2084 进制转换
  8. python注入点查找_sqlmap常用注入点检测爆破命令
  9. js 点击闭包_【JS进阶】Javascript 闭包与Promise的碰撞
  10. 删除指定目录下的所有文件与更改文件扩展名
  11. BGP(边界网关协议)
  12. android web service视频教程,需要一个简单的android / webservice工作教程?
  13. 腾讯电脑管家修复代理服务器,腾讯电脑管家修复msvcp140.dll丢失的方法
  14. css页脚怎么居中,无法使我的页脚内容居中
  15. 找出知晓秘密的所有专家(leetcode 2092)
  16. 宋丹丹晒年轻旧照 桃眼杏腮被赞美女
  17. “爆打”团队阿尔法发布 以及 第四周任务
  18. 前端wx-jssdk的使用及企微和微信下分享等功能自定义处理
  19. 软考高项论文----进度管理
  20. amd c6 support_完胜690!最详尽的C68G芯片组性能评测

热门文章

  1. android校准电池,安卓手机电量校准教程
  2. 河南郑州—2018区块链传统行业创新峰会
  3. 美赛BOOM数学建模4-3马尔科夫预测
  4. Windows Server 2008 安装VMware Tools
  5. 浅析溯源(2):如何实现区块链溯源
  6. C语言基础习题及答案7
  7. 健康生活 多用肥皂少用洗涤剂
  8. 使用ADB命令卸载安卓设备上的应用
  9. 【转】百度腾讯阿里,其大数据优劣势与策略分析
  10. AppiumLibrary 时间控件的选择