List数据分段以后再使用多线程执行,提高效率
大致业务场景,需要后台刷新产品详情缓存,for循环跑需要1个多小时才能执行完毕。
最后使用多线程处理,伪代码如下
//查询所有商品list ,商品较多几千只,不可能一下起几千线程处理。所以先将list分割
// PAGE_SIZE 可在配置中心设定,动态调整list分割数量
List<String> idList;
int currentPage = 1;
int pageSize = Integer.valueOf(PAGE_SIZE);
int totalPage = idList.size() % pageSize>0?(idList.size() / pageSize)+1:idList.size() / pageSize;
while (currentPage <= totalPage) {
//把list分段
List<String> currentList = pageBySubList(idList, currentPage, pageSize);
//具体多线程处理逻辑
executeRefreshDetail(currentList);
currentPage += 1;
}
/**
* 这里是每一段list
* 然后使用多线程处理,利用CountDownLatch 机制,保证一批次全部处理完成后再进行下一段。防止过多任务,压垮下游服务
*/
private void executeRefreshDetail(List<String> idList) {
if (CollectionUtils.isEmpty(idList)) {
return;
}
try {
CountDownLatch countDownLatch = new CountDownLatch(idList.size());