import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
private void exeBathThread(List<XXX> allList){
if(allList.isEmpty()){
log.info("----------------集合为空-----------------------");
return;
}
try {
// 切割集合数据,36个为一组在同个线程中执行,数字可自己进行更改
// 可为其它数据格式,自己根据需求变动
// List>> lists = Lists.partition(listMap, 36);
// List> lists = Lists.partition(list, 36);
List<List<XXX>> lists = Lists.partition(allList,36);
log.info("---------------------------多线程集合切割分组,size={},group={}",36,lists.size());
// 创建线程池子
ExecutorService executorService = Executors.newCachedThreadPool();
// 线程同步围栏
CountDownLatch cdl = new CountDownLatch(lists.size());
long startList = System.currentTimeMillis();
log.info("---------------------------多线程主线程开始,time={}",new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));
// 线程池中取线程 执行集合
lists.forEach(list->
executorService.submit(() -> {
// 业务数据处理
// ......
// 递减锁存器的计数,如果计数到达零,则释放所有等待的线程
cdl.countDown();
}));
// 主线程等待子线程执行完成再继续执行
cdl.await();
// 关闭线程池
executorService.shutdown();
log.info("---------------------------多线程主线程结束,time={}",new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));
long endList = System.currentTimeMillis();
log.info("---------------------------多线程主线程结束,耗时[{}]秒",(endList - startList)/1000);
} catch (Exception e) {
e.printStackTrace();
}
}
作者:鲨鱼辣椒灬
来源:CSDN