项目场景:

简述项目相关背景:
例如:获取大量数据并处理,生成execl文件导出


问题描述:

5W条数据处理后生成execl文件需要6个小时,效率慢 APP 中接收数据代码:

@Overridepublic void run() {bytes = mmInStream.read(buffer);mHandler.obtainMessage(READ_DATA, bytes, -1, buffer).sendToTarget();}

原因分析:

数据量太多


解决方案:

使用多线程批量处理数据,下面是线程类,直接复制即可

package com.wwhl.cms.service.impl;import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.*;/*** @param <H> 为被处理的数据类型* @param <T>返回数据类型*/
public abstract class MultiThread<H,T>{private final ExecutorService exec; //线程池private final BlockingQueue<Future<T>> queue = new LinkedBlockingQueue<>();private final CountDownLatch startLock = new CountDownLatch(1); //启动门,当所有线程就绪时调用countDownprivate final CountDownLatch endLock; //结束门private final List<H> listData;//被处理的数据/*** @param list list.size()为多少个线程处理,list里面的H为被处理的数据*/public MultiThread(List<H> list){if(list!=null&&list.size()>0){this.listData = list;exec = Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors()); //创建线程池,线程池共有nThread个线程endLock = new CountDownLatch(list.size());  //设置结束门计数器,当一个线程结束时调用countDown}else{listData = null;exec = null;endLock = null;}}/**** @return 获取每个线程处理结速的数组* @throws InterruptedException* @throws ExecutionException*/public List<T> getResult() throws InterruptedException, ExecutionException{List<T> resultList = new ArrayList<>();if(listData!=null&&listData.size()>0){int nThread = listData.size(); //线程数量,可根据系统性能自定义线程数for(int i = 0; i < nThread; i++){H data = listData.get(i);Future<T> future = exec.submit(new Task(i,data){@Overridepublic T execute(int currentThread,H data) {return outExecute(currentThread,data);}}); //将任务提交到线程池queue.add(future); //将Future实例添加至队列}startLock.countDown(); //所有任务添加完毕,启动门计数器减1,这时计数器为0,所有添加的任务开始执行endLock.await(); //主线程阻塞,直到所有线程执行完成for(Future<T> future : queue) {resultList.add(future.get());}exec.shutdown(); //关闭线程池}return resultList;}/*** 每一个线程执行的功能,需要调用者来实现* @param currentThread 线程号* @param data 每个线程被处理的数据* @return T返回对象*/public abstract T outExecute(int currentThread,H data);/*** 线程类*/private abstract class Task implements Callable<T>{private int currentThread;//当前线程号private H data;public Task(int currentThread,H data){this.currentThread=currentThread;this.data=data;}@Overridepublic T call() throws Exception {startLock.await(); //线程启动后调用await,当前线程阻塞,只有启动门计数器为0时当前线程才会往下执行T t =null;try{t = execute(currentThread,data);}finally{endLock.countDown(); //线程执行完毕,结束门计数器减1}return t;}/*** 每一个线程执行的功能* @param currentThread 线程号* @param data 每个线程被处理的数据* @return T返回对象*/public abstract T execute(int currentThread,H data);}
}

使用多线程批量处理数据使用场景:

 /*** 分割list集合** @param dataList* @return*/public List<Card> subList(List<Card> dataList) {List<Card> resultlist = new ArrayList<>();//存放批量数据处理的总结果集if (null != dataList && dataList.size() > 0) {int pointsDataLimit = 10;//限制条数 10条一批  Integer size = dataList.size();//判断是否有必要分批if (pointsDataLimit < size) {//大于10条int part = size / pointsDataLimit;//分批数for (int i = 0; i < part; i++) {List<Card> listPage = dataList.subList(0, pointsDataLimit);  //10条数据Integer start = cardlist.size();//10条数据在总结果集的开始下标cardlist = testTime(listPage, resultlist );//返回拼接后的总结果集Integer end = resultlist .size();//10条数据在总结果集的结束下标for (i = start; i < end; i++) {//对总数据集的10条数据进行业务处理}//剔除已经处理过的10条数据dataList.subList(0, pointsDataLimit).clear();}if (!dataList.isEmpty()) {//小于10条cardlist = testTime(dataList, cardlist);//处理最后的数据}} else {}}return resultlist ;}
 /*** 多线程处理批量数据** @param splitList 处理数据* @param cardlist  处理后总数据** @return*/public List<Card> testTime(List<Card> splitList, List<Card> cardlistr) {List<Card> list = null;try {MultiThread<Card, Card> multiThread = new MultiThread<Card, Card>(splitList) {              @Overridepublic Card outExecute(int currentThread, Card data) {//业务处理/* String iccid = data.getIccid();String allOrder = cardServerService.findAllOrder(iccid);String allFlow = cardServerService.allFlowByiccid(iccid);String allUseFlow = cardServerService.allUseFlowByiccid(iccid);Card card = cardMapper.findByIccid(iccid);String monthFlow = card.getMonthFlow();data.setMonthFlow(monthFlow);data.setAllOrder(allOrder);data.setAllFlow(allFlow);data.setAllUseFlow(allUseFlow);return data;*///业务处理end}};list = multiThread.getResult();//返回结果for (Card ccar : list) {cardlist.add(ccar);//批量数据遍历放入总结果}} catch (Exception e) {e.printStackTrace();}return cardlist;}

Card实体

/*** 卡实体类*/
public class Card {/*** 主键id*/private Long id;/*** 卡号*/private String cardNum;
}

多线程处理大量数据 java相关推荐

  1. 多进程多线程处理文本数据

    运行环境 python 3.6 numpy 1.18 threadpool 1.3 内置库:multiprocessing 代码简介 实现一个通用多进程+多线程支持方法.可以动态支持其他functio ...

  2. 大数据 java 代码示例_功能Java示例 第7部分–将失败也视为数据

    大数据 java 代码示例 这是称为" Functional Java by Example"的系列文章的第7部分. 我在本系列的每个部分中开发的示例是某种"提要处理程序 ...

  3. 大数据 java 代码示例_Java变量类型与示例

    大数据 java 代码示例 Java变量 (Java variables) Variables are the user-defined names of the memory blocks, and ...

  4. 大数据+java交流微信群

    一起进行大数据+Java的知识传递与分享,快来加入吧!! 本人程序员,发现身边很多朋友经常会问一些技术问题,特建立微信群供全国各地的朋友一起讨论学习,资源共享,本人也积累了很多专业性的资料,不定期分享 ...

  5. 一起重新开始学大数据-java篇-DAY01-第一个java代码helloworld

    一起重新开始学大数据-java篇 -DAY01-第一个java代码helloworld 计算机: 按照指定程序,自动高速处理海量数据 计算机组成 硬件和软件组成 硬件: cpu:计算 内存:提供计算资 ...

  6. JAVA-MySQL四{MySQL重点DQL查询数据}JAVA从基础开始 --7

    JAVA-MySQL四{MySQL重点DQL查询数据}JAVA从基础开始 --7 DQL查询语句 DQL - Data Query Language:数据查询语言 指定查询字段 1.全查 2.指定字段 ...

  7. 将一个整数转换为32位数据(java实现)

    将一个整数转换为32位数据(java实现) 将一个整数转换为二进制数据并且打印出来,都知道计算机底层使用32为数据来存储数据的.那么如何将一个整数通过代码的形式打印出来. 首先肯定需要用到位运算.通过 ...

  8. 【全集】大数据Java基础

    课程介绍 本课程是由猎豹移动大数据架构师,根据Java在公司大数据开发中的实际应用,精心设计和打磨的大数据必备Java课程.通过本课程的学习大数据新手能够少走弯路,以较短的时间系统掌握大数据开发必备语 ...

  9. 视频教程-大数据Java强化班(十)之大数据爬虫-Java

    大数据Java强化班(十)之大数据爬虫 10年一线开发及项目管理经验,6年以上大数据项目架构.实施.开发与运维经验,骨灰级大数据玩家,对Hadoop.Storm.Spark.Flink.Kylin.D ...

最新文章

  1. mysql update join 锁表_Mysql事务中Update是否会锁表?
  2. DL之MobileNetV2:MobileNetV2算法的架构详解(包括ReLu的意义)
  3. java调C接口_java通过jni调用C程序接口
  4. POJ1733,jzoj1779-Parity game(奇偶游戏)【带权并查集,离散化】
  5. 【杭州云栖】边缘计算ENS:拓展云的边界
  6. 由相机的自身参数求解内参矩阵
  7. 解锁新的“维权方式”?车主放花圈维权!特斯拉大怒:低俗方法滋事
  8. 电脑重装系统虚拟机安装xp的教程
  9. 台式机设成仅计算机,如何把台式电脑设置成wifi热点
  10. 2017秋季武汉工程大学全日制自考本科招生简章
  11. mti杂波抑制仿真 matlab,MTI+MTD+CFAR简单仿真
  12. 彻底搞懂js中的this指向
  13. 微信内置页实现自动拨号到页面的功能
  14. Customize your Chatter Experience.
  15. win10专业版有必要吗_Win10自带Windows defender 还有必要安装其它杀毒软件吗?
  16. cordova应用兼容iOS11+和iPhoneX刘海屏
  17. python环境IDLE下载
  18. c语言 求两个数的平均值
  19. Web Storm 20203.3详解安装汉化
  20. 使用ArcCatalog、ArcSDE连接Oracle

热门文章

  1. Android --- 5G网络,android系统开发教程
  2. 小米手机刷机失败补救方法详解
  3. 【图像分割】基于区域的重叠椭圆拟合实现细胞分割附matlab代码
  4. python 弱引用
  5. 黑群晖vmm专业版_在NAS上运行虚拟机:群晖虚拟化套件VMM正式发布
  6. float型数据表示的最大数字到底是多少(答案:0x7f7f ffff)
  7. 旁听硕士答辩——爱立信,WireShark,GGSN
  8. Pwnable之passcode
  9. 【阿里云高校计划】在线Linux学习
  10. 推荐一款个人资料管理软件(免费,Wizknowledge)