Java8创建多线程工具类
使用Java8创建多线程任务池
直接上代码
package com.smz.service.utlis;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.Callable;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
import java.util.function.Function;
import java.util.stream.Collectors;
import java.util.stream.Stream;
/**
* @Date 20230915
*
* @author smz
*/
@Slf4j
@Component
public class AssetsSyncUtil {
/** 每个线程处理数量 */
private static int INTERVAL = 500;
/**
* 多线程批量导入数据
*
* @param successDataList 总数据
* @param batchInsertHandler 批量插入数据逻辑
* @param <T>
*/
public <T> void batchInsertAssetsWithMultiThread(
List<T> successDataList, Function<List<T>, Integer> batchInsertHandler) throws Exception {
// 每个线程处理数量
int interval = INTERVAL;
// 导入数据总数
int count = successDataList.size();
// list数据拆分数(线程启动数)
int splitNum = count / interval + 1;
if (count % interval == 0) {
splitNum = count / interval;
}
// 创建线程池
ThreadPoolExecutor threadPoolExecutor =
new ThreadPoolExecutor(
splitNum, splitNum, 0, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<Runnable>());
// 定义一个任务集合
List<Callable<Integer>> tasks = new ArrayList<Callable<Integer>>();
// 拆分successDataList并分配给每个线程
Stream.iterate(0, n -> n + 1)
.limit(splitNum)
.forEach(
i -> {
// 单个任务的处理的数据集合
List<T> collectList =
successDataList.stream()
.skip(i * interval)
.limit(interval)
.collect(Collectors.toList());
// 任务集合中增加任务
tasks.add(
() -> {
Thread t = Thread.currentThread();
log.info("---->>>>线程名{}", t.getName());
return batchInsertHandler.apply(collectList);
});
});
// 调用所有任务
threadPoolExecutor.invokeAll(tasks);
// 关闭线程池
threadPoolExecutor.shutdown();
}
}
调用方式
@Lazy @Resource private AssetsSyncUtil assetsSyncUtil;
public void test() throws Exception {
// // 执行批量插入的逻辑实现
assetsSyncUtil.batchInsertAssetsWithMultiThread(
queryShipOwnerInfo(), (t) -> saveTheInitializationData(t));
}
public Integer saveData(List<XcbShipownerUser> shipownerUserList) {
//具体执行逻辑
shipownerUserList.forEach( ship->{
System.out.println("操作内容");
});
}
结束