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年新年快乐,疫情快点过去吧。

posted @ 2022-01-07 17:12  levi125  阅读(386)  评论(2编辑  收藏  举报