简介
写了个工具类方便多线程消费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年新年快乐,疫情快点过去吧。