首页 > 编程语言 >JAVA多线程处理大量数据(二)--推荐

JAVA多线程处理大量数据(二)--推荐

时间:2023-03-10 19:22:15浏览次数:35  
标签:JAVA java -- List subList import 多线程 public size

背景说明:要对服务器上一个目录进行全量文件读取

1、多线程执行类--FileThreadUtils.java

import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.io.FileUtil;
import com.alibaba.fastjson.JSONObject;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Component;
import java.io.IOException;
import java.util.*;
import java.util.concurrent.*;
import java.util.stream.Collectors;

/**
 * @Description: 文件多线程工具类
 * @Date: 2023/3/9 14:12
 * @Version: 1.0
 */
@Slf4j
@Component
public class FileThreadUtils{

    /**
     * @description:  根据文件数量动态创建线程数
     * @date: 2023/3/10 15:55
     * @param fileNumber
     * @return java.lang.Long
     */
    public Integer getThreadSize(int fileNumber){
        if(fileNumber <=10){return 2;}
        if(fileNumber <=50){return 5;}
        if(fileNumber <=100){return 10;}
        if(fileNumber <=500){return 100;}
        if(fileNumber <=1000){return 200;}
        if(fileNumber <=5000){return 500;}
        if(fileNumber <=10000){return 1000;}
        if(fileNumber <=50000){return 2000;}
        if(fileNumber <=100000){return 5000;}
        return (fileNumber + 10 - 1) / 25;
    }

    /**
     * @description:  使用多线程处理文件
     * @date: 2023/3/10 16:00
     * @param scanDTO
     * @return java.lang.String
     */
    public void scanAllFile(List<String> fileList) throws InterruptedException, ExecutionException {
        //所少条数据开启一个子线程
        Integer perCount = getThreadSize(fileList.size());
        List<List<String>> groupList = ListUtils.partition(fileList, perCount);
        ExecutorService es = Executors.newFixedThreadPool(groupList.size());

        List<FileTask> tasks = new ArrayList<>();
        for (int i = 0; i < groupList.size(); i++){
            log.info("一批数据加入线程池: "+i);
            tasks.add(new FileTask(groupList.get(i)));
        }

        List<Future<Map<String,Object>>> futures = es.invokeAll(tasks);
        es.shutdown();

        //汇总各个子线程的数据结果
        //这里处理线程结果
        for (int i = 0; i < futures.size(); i++){
            Future<Map<String, Object>> mapFuture = futures.get(i);
            //System.out.println("index:" + i + ",future:"+ futures.get(i).get());
            Map<String, Object> stringObjectMap = mapFuture.get();
           
        }
      
    }

    /**
     * @description:  文件处理单线程
     * @date: 2023/3/10 16:01
     * @return
     */
    public static class FileTask implements Callable<Map<String,Object>>{
        List<String> subFileList;
        public FileTask(List<String> list) {
            this.subFileList = list;
        }

        @Override
        public Map<String,Object> call() throws Exception {
          
            for (String filePath : subFileList) {
                filePath = filePath.replaceAll("\\\\", "/");
                log.info(Thread.currentThread().getName() + " 线程开始处理文件 :" + filePath);
                
            }

            Map<String,Object> subResultMap = new HashMap<>();
            //log.info("subMap{}",subResultMap);
            return subResultMap;
        }
    }

}

 

2、数据分组工具类-- ListUtils.java

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

/**
 * @Description: TODO
 * @Date: 2023/3/8 9:39
 * @Version: 1.0
 */
public class ListUtils {
    /**
     * 集合按长度分组
     *
     * @param list
     * @param size
     * @param <T>
     * @return
     */
    public static <T> List<List<T>> partition(final List<T> list, final int size) {
        if (list == null) {
            throw new IllegalArgumentException("List must not be null");


        }
        if (size <= 0) {
            throw new IllegalArgumentException("Size must be greater than 0");
        }
        List<List<T>> result = new ArrayList<>();
        Iterator<T> it = list.iterator();
        List<T> subList = null;
        while (it.hasNext()) {
            if (subList == null) {
                subList = new ArrayList<>();
            }
            T t = it.next();
            subList.add(t);
            if (subList.size() == size) {
                result.add(subList);
                subList = null;
            }
        }
        //补充最后一页
        if (subList != null) {
            result.add(subList);
        }
        return result;

    }
}

 

标签:JAVA,java,--,List,subList,import,多线程,public,size
From: https://www.cnblogs.com/guliang/p/17204476.html

相关文章

  • 南向设备开发
    南向设备开发docker空间不足:C盘又不足:重装。。全部分配给C虽然但是我会死。。烦内,没有U盘,只能等。。短暂缓解:https://zhuanlan.zhihu.com/p/92079518docker装好了......
  • mount nfs4 ....No such file or directory
    转载自:https://zhuanlan.zhihu.com/p/434209418https://blog.csdn.net/yusiguyuan/article/details/11515715 ============ #安装nfs-utilsrpcbindyum-yinst......
  • 算法学习笔记(18): 平衡树(一)
    平衡树建议在清楚二叉搜索树的所有操作之后食用本文。本文将略过部分基础知识目录平衡树Treap旋转插入删除其他操作FHQ-Treap分裂合并其他操作Splay旋转伸展其他操作WB......
  • Linux简单命令练习
     ......
  • 书籍数据科学技术与应用_神经网络
    Sklearn模块无监督:cluster(聚类)、decomposition(因子分解)、mixture(高斯混合模型)、neural_network(无监督的神经网络)、covariance(协方差估计)有监督:tree(决策树)、svm(支持向量......
  • RocketMQ概念与架构
    一般rockerMQ有四部分组成nameserver 路由控制中心主要包括broker的管理和tpoic查询  producer和consumer通过那么server就可以查到topic在哪个broker上producer......
  • 日结
    1、原型是你可以在忽略细节的情况下,考虑项目走流程,主要使用场景,他们是否正确,是否可行。通常也可以用用于演示2、原型制作是一种学习经验,其价值并不在于所产生的代码,而在于......
  • 后端存储—pv—pvc—pod yaml文件
    转载自:https://zhuanlan.zhihu.com/p/434209418======== 使用PV,PVC,NFS来做持久化存储的综合实例。(注意顺序,先搭建NFS服务器--定义PV-定义PVC-定义Pod)#vimnginx-p......
  • C/C++小学生测验[2023-03-10]
    C/C++小学生测验[2023-03-10]题目2:小学生测验面向小学1~2年级学生,随机选择两个整数和加减法形成算式要求学生解答。功能要求:(1)进入测试之前先输入用户名、密码登录,......
  • ALOG01 印章
    试题算法训练印章importjava.util.Scanner;/***@authorHuaWang135608*@date2023.03.1016:34:11*@description[试题算法训练印章](https://lx.lanqia......