try {File file = new File(path);File[] files = file.listFiles();log.info("当前共有文件 "+files.length+"个");List<File> filesList = new ArrayList<>(Arrays.asList(files));List<List<File>> dividedLists = SplitListUtils.splitList(filesList, 10);int numThreads = Math.min(10, dividedLists.size()); // 获取实际的任务数量log.info("线程数:"+ numThreads);// 创建线程池并执行任务ExecutorService executor = Executors.newFixedThreadPool(numThreads);for (List<File> subFiles : dividedLists) {executor.execute(() -> processFiles(subFiles));}executor.shutdown();boolean finished = false;try {finished = executor.awaitTermination(Long.MAX_VALUE, TimeUnit.NANOSECONDS);} catch (InterruptedException e) {// 处理中断异常e.printStackTrace();}// 在执行完所有任务后继续后面的操作处理 collect_task 结束if (finished) {// 所有任务已完成,可以执行后续操作System.out.println("ok.....");} else {// 等待超时或者被中断,可以根据需要进行处理System.out.println("执行中....");}} catch (Exception e) {e.printStackTrace();}
public static List<List<File>> splitList(List<File> list, int numLists) {List<List<File>> dividedLists = new ArrayList<>();int size = list.size();int average = size / numLists;int remainder = size % numLists;int index = 0;for (int i = 0; i < numLists; i++) {int sublistSize = average + (i < remainder ? 1 : 0);List<File> sublist = new ArrayList<>(list.subList(index, index + sublistSize));if(sublist.size() > 0){dividedLists.add(sublist);}index += sublistSize;}return dividedLists;}
上面代码的拆分, 最多集合是10个,如果大集合的总数小于10,那就是大集合的数量。要是大集合的数量大于10个,那就均分到10个小集合中。