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个小集合中。文章来源地址https://www.toymoban.com/news/detail-723763.html
文章来源:https://www.toymoban.com/news/detail-723763.html
到了这里,关于多线程处理文件集合,先拆分,在执行的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!