• List批量任务多线程执行工具类


    简介

    写了个工具类方便多线程消费List数据

    Maven

    用到了guava的Lists工具切分,maven坐标:

    <dependency>
        <groupId>com.google.guava</groupId>
        <artifactId>guava</artifactId>
        <version>20.0</version>
    </dependency>
    

    BatchThreadUtil

    package com.levi.uitls;
    
    import com.google.common.collect.Lists;
    import com.levi.common.exception.AppException;
    
    import java.util.ArrayList;
    import java.util.List;
    import java.util.concurrent.ExecutorService;
    import java.util.concurrent.Executors;
    import java.util.concurrent.TimeUnit;
    import java.util.function.Consumer;
    
    /**
     * 批量任务多线程执行工具类.
     *
     * @author levi
     * @version 1.0
     * @date 2022/1/7 15:51
     **/
    public class BatchThreadUtil {
    
        /**
         * 多线程执行处理List
         * @param taskList 要处理的数据列表
         * @param threadNum 线程数量
         * @param consumeMethod 处理数据的具体方法
         */
        public static void execList(List<?> taskList, int threadNum, Consumer<List<?>> consumeMethod) {
            execList(taskList, threadNum, 0, consumeMethod);
        }
    
        /**
         * 多线程执行处理List
         * @param taskList 要处理的数据列表
         * @param threadNum 线程数量
         * @param minBatchSize 最小批次数, 如果小于此数量, 则线程数量值=1; 0则忽略。
         * @param consumeMethod 处理数据的具体方法
         */
        public static void execList(List<?> taskList, int threadNum, int minBatchSize, Consumer<List<?>> consumeMethod) {
            if (taskList == null || taskList.isEmpty())
                return;
    
            //切分
            int avg = 1;
            if (threadNum > 0 && (minBatchSize == 0 || minBatchSize > 0 && taskList.size() > minBatchSize)) {
                avg = taskList.size() / threadNum + 1;
            }
            List<? extends List<?>> lists = Lists.partition(taskList, avg);
    
            //多线程
            ExecutorService service = Executors.newCachedThreadPool();
            try {
                for (List<?> datas : lists) {
                    service.execute(()->{
                        //消费
                        consumeMethod.accept(datas);
                    });
                }
            } catch (Exception e) {
                e.printStackTrace();
                throw new AppException(e.getMessage());
            } finally {
                service.shutdown();
                try {
                    service.awaitTermination(1, TimeUnit.DAYS);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
    
        }
    
    
        //测试
        public static void main(String[] args) {
            List<String> lists = new ArrayList<>();
            lists.add("1");
            lists.add("2");
            lists.add("3");
            lists.add("4");
            lists.add("5");
            lists.add("6");
            //测试多线程处理List
            execList(lists, 1, 2, (o) -> dealList(o) );
            execList(lists, 0, 0, (o) -> dealList(o) );
        }
    
        //测试处理list的具体方法
        public static void dealList(List<?> list){
            for (Object o : list) {
                System.out.println(Thread.currentThread() + " 打印:" + o);
            }
        }
    
    }
    
    

    最后

    2022年新年快乐,疫情快点过去吧。

  • 相关阅读:
    解决 搭建Jekins过程中 启动Tomcat的java.net.UnknownHostException异常
    射手和农场主
    java 和 JS(javaScript)中的反斜杠正则转义
    分享修改密码的SharePoint Web part: ITaCS Change Password web part
    分享微软官方Demo用的SharePoint 2010, Exchange 2010, Lync 2010虚拟机
    Office 365 的公共网站的一些限制及解决的办法
    SharePoint 2013 关闭 customErrors
    安装 KB2844286 导致SharePoint 2010 XSLT web part 显示出现错误
    安装Office Web Apps Server 2013 – KB2592525安装失败
    如何将hyper-v虚拟机转换成vmware的虚拟机- 转换SharePoint 2010 Information Worker Demonstration and Evaluation Virtual Machine (SP1)
  • 原文地址:https://www.cnblogs.com/levi125/p/15775925.html
Copyright © 2020-2023  润新知