记录一次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.csdn.net/Star_Chan/article/details/89308620
https://blog.csdn.net/TreeShu321/article/details/112793887
题外:怎么判断他们都结束了,再执行下一步操作呢?有木有一些优雅的写法,使用countDownLatch