package com.yingzi.bizcenter.fans.common.utils;
import com.yingzi.bizcenter.fans.common.utils.ThreadPoolExecutorUtil;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections.CollectionUtils;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.concurrent.CountDownLatch;
import java.util.function.Function;
/**
* @Author chenwenlin
* @Date 2023/2/17 15:49
*/
@Slf4j
public class CountDownLatchUtil {
/**
* 分批执行
*
* @param list 集合
* @param size 每次执行长度
* @param function 请求参数
* @return {@link List<R>} 返回集合列表
*/
public static <T, R> List<R> latch(List<T> list, Integer size, Function<List<T>, List<R>> function) {
long begin = System.currentTimeMillis();
List<R> result = Collections.synchronizedList(new ArrayList<>());
int count = (list.size() - 1) / size + 1;
CountDownLatch countDownLatch = new CountDownLatch(count);
for (int i = 0; i < count; i++) {
// 线程池执行
int index = i * size;
ThreadPoolExecutorUtil.getInstance().execute(() -> {
try {
int r = Math.min(index + size, list.size());
// 执行请求
List<R> data = function.apply(list.subList(index, r));
if (CollectionUtils.isNotEmpty(data)) {
result.addAll(data);
}
} catch (Exception exception) {
log.warn("线程执行异常:{}", exception.getMessage());
} finally {
//线程计数器-1
countDownLatch.countDown();
}
});
}
try {
countDownLatch.await();
log.debug("获取人力用户信息完成:分{}个线程完成", count);
} catch (Exception exception) {
log.warn("线程执行异常:{}", exception.getMessage());
}
log.debug("总耗时: {} ms", System.currentTimeMillis() - begin);
// 所有请求完毕才会返回接口
return result;
}
}
请求示例
// 循环遍历
List<AccountInfoResDTO.FullInfo> result = CountDownLatchUtil.latch(new ArrayList<>(hmcAccountIdSet), 200, (list) -> {
return ResultDtoUtil.getData(userAccountFeignApi.getList(list));
});