记录一次list拆分,并开启多线程处理
public static <T> Map<Integer,List<T>> batchList(List<T> list, int batchSize){
Map<Integer,List<T>> itemMap = new HashMap<>();
itemMap.put(1, new ArrayList<T>());
for(T e : list){
List<T> batchList= itemMap.get(itemMap.size());
//当list满足批次数量,新建一个list存放后面的数据
if(batchList.size() == batchSize){
batchList = new ArrayList<T>();
itemMap.put(itemMap.size()+1, batchList);
}
batchList.add(e);
}
return itemMap;
}
public void testThead(){
List<Integer> list = new ArrayList<>(100000);
for(int i=0; i< 100000; i++) {
list.add(i);
}
int threadSize = 10;
int batcSize = list.size()/threadSize + 1;
System.out.println(batcSize);
Map<Integer,List<Integer>> itemMap = batchList(list, batcSize);
CountDownLatch countDownLatch = new CountDownLatch(itemMap.size());
//分批次更新
for(Integer i : itemMap.keySet()){
CompletableFuture.runAsync(() -> {
System.out.println(i+"->"+"size:"+itemMap.get(i).size()+"->"+itemMap.get(i));
countDownLatch.countDown();
}, threadPool);
}
try {
Thread.sleep(3000);
countDownLatch.await(); // 等待计算器归零,然后再向下执行
System.out.println("end");
} catch (InterruptedException e) {
e.printStackTrace();
}
}

参考
https://blog.youkuaiyun.com/Star_Chan/article/details/89308620
https://blog.youkuaiyun.com/TreeShu321/article/details/112793887
题外:怎么判断他们都结束了,再执行下一步操作呢?有木有一些优雅的写法,使用countDownLatch
该篇博客介绍了如何在Java中将一个大列表拆分成多个小批次,并利用多线程进行处理。通过CountDownLatch实现线程同步,确保所有线程执行完毕后再进行下一步操作。代码示例展示了如何创建线程池并异步处理每个批次的数据。
624

被折叠的 条评论
为什么被折叠?



