首页 > 编程语言 >JAVA多线程处理大量数据

JAVA多线程处理大量数据

时间:2023-03-08 20:24:34浏览次数:47  
标签:JAVA java 处理 List subList util import 多线程 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 java.io.File;
import java.io.IOException;
import java.util.*;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.stream.Collectors;

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

    //待处理数据
    private List<String> fileList;
    //每个线程处理的数据量
    private int perCount = 1000;
    //待处理数据总数量
    private int count = 0;


    /**
     * @description: 设置文件数据 
     * @date: 2023/3/8 10:24
     * @param list
     * @return void
     */
    public void setFileList(List<String> list) {
        this.fileList = list;
        this.count = list.size();
    }

    /**
     * @description:  扫描多线程
     * @date: 2023/3/8 10:21
     * @param
     * @return void
     */
    public void multiThread(){
        // 一千条为基准为一个线程处理
        List<List<String>> groupList = ListUtils.partition(fileList, perCount);
        CountDownLatch countDownLatch = new CountDownLatch(groupList.size());
        ExecutorService executorService = Executors.newFixedThreadPool(groupList.size());

        for (int i = 0; i < groupList.size(); i++) {
            int finalI = i;
            executorService.execute(() -> {
                List<String> subFileList = groupList.get(finalI);
                for (String filePath : subFileList) {
                    filePath = filePath.replaceAll("\\\\", "/");
                    log.info(Thread.currentThread().getName() + " 线程开始处理文件 :" + filePath);
                    //这里放置你的业务代码
                    //这里放置你的业务代码
                    //这里放置你的业务代码
                }
                countDownLatch.countDown();
            });
        }
        try {
            countDownLatch.await();
            executorService.shutdown();   //关闭线程池
        } catch (InterruptedException e) {
            //throw new RuntimeException(e);
            log.info("线程池关闭异常: ",e.getMessage());
        }
    }

}

 

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,util,import,多线程,size
From: https://www.cnblogs.com/guliang/p/17195972.html

相关文章

  • JAVA 实现导入导出Excel-02随笔
    忙碌的一天第一天写博客就让我煞费苦心,从上午完成的第一篇开始,具目前为止已经是下午18:41了;读者可能好奇为什么写这一篇随笔,我只能回答说太无聊了哈哈哈;其实不然,刚到......
  • python单例模式处理多线程问题
    #单例模式处理多线程的问题importthreadingimporttimeclassSingle:instance=Nonedef__init__(self,name):self.name=namedef__new__(cls,......
  • 获取当前jar包路径_java获取jar文件
    一、获取可执行jar包所在目录(1)方法一:使用System.getProperty("java.class.path")获取classpath的路径,若没有其他依赖,在cmd下运行该可执行jar包,则该值即为该jar包的绝对......
  • 获取当前jar包路径_java获取jar文件
    一、获取可执行jar包所在目录(1)方法一:使用System.getProperty("java.class.path")复制获取classpath的路径,若没有其他依赖,在cmd下运行该可执行jar包,则该值即为该jar包......
  • Java多种方法实现等待所有子线程完成再继续执行
    简介在现实世界中,我们常常需要等待其它任务完成,才能继续执行下一步。Java实现等待子线程完成再继续执行的方式很多。我们来一一查看一下。Thread的join方法该方法是Thre......
  • java springboot mybatis plus 3.4 实现执行任意 sql 语句
    试了SqlRunner一直失败,不知道原因,于是试了如下方法,完美解决。@AutowiredprivateSqlSessionFactorysqlSessionFactory;publicList<Map<String,Object>>exec......
  • 【JavaScript】38_对象的序列化----JSON
    3、对象的序列化对象的序列化JS中的对象使用时都是存在于计算机的内存中的序列化指将对象转换为一个可以存储的格式在JS中对象的序列化通常是一个对象转换为字符串(JSON字......
  • java动态代理
    1️⃣首先创建需要的接口以及对应实现类来测试代理模式(动态代理)      2️⃣创建动态代理类,去帮我代理一些接口   3️⃣创建一个获取代理对象的工厂 ......
  • java HashMap集合练习之键是String值是Student
           ......
  • java 列表查询
    最常用的便是for循环查询:for(StudentRecordrecord:records){if(record.getYear()==yearSearch){System.out.println(record.getId()+""+record.g......