zoukankan      html  css  js  c++  java
  • 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年新年快乐,疫情快点过去吧。

  • 相关阅读:
    福建90后大学生陈贺的果园梦
    95后女孩穿旗袍走红,老手艺在淘宝迎来不一样的改变
    动态创建完整功能的图片元素
    jquery 插入dom
    它会选择相对于span的所有div父元素
    表单过滤器之checkbox
    匹配所有的最后一个子元素
    docker 常用指令
    splice操作
    当《连线》说“第一台值得买的智能电视终于出现”时,你信不信?
  • 原文地址:https://www.cnblogs.com/levi125/p/15775925.html
Copyright © 2011-2022 走看看