线程池的应用:
List
//创建线程池
ExecutorService executeService = Executors.newCachedThreadPool();
//taskList为任务集合,GetProductAndFileCallable为实现了Callable的任务类
List
long startTime = System.currentTimeMillis();
for (int i = 0;i < directoryPathList.size();i ++) {
//往任务集合中添加需要执行的任务
taskList.add(new GetProductAndFileCallable(directoryPathList.get(i)));
}
try {
//执行任务
List
//这里会阻塞等待resultList获取到所有异步执行的结果才会执行
for (Future
productList.addAll(future.get().get("product"));
fileList.addAll(future.get().get("file"));
}
任务类:
/**
* 处理文件夹的线程,返回文件夹下的所有文件和总结的产品
*/
public class GetProductAndFileCallable implements Callable
//需要处理的文件夹路径
private String directory;
public GetProductAndFileCallable(String directory){
this.directory = directory;
}
@Override
public Map
Map
//文件夹下的所有文件
System.out.println("文件夹路径:directory"+directory);
Map
List
List
paraMap.put("filePaths",filePaths);
paraMap.put("fileNames",fileNames);
Map
resultMap.put("file",fileMap.get("filePaths"));
//提取出产品
List
List
for (String s : fileMap.get("fileNames")) {
int index = s.lastIndexOf(".");
fileNameList.add(s.substring(0,index));
}
//集合利用HaseSet去重
HashSet set = new HashSet(fileNameList);
productList.addAll(set);
resultMap.put("product",productList);
return resultMap;
}
/**
* 递归提取文件夹下的所有文件
* @param path
* 每次都将Map按参数传入才会是最终结果
*/
private synchronized Map
//最终返回的所有文件
//List
File file = new File(path);
// 如果这个路径是文件夹
if (file.isDirectory()) {
// 获取路径下的所有文件
File[] files = file.listFiles();
for (int i = 0; i < files.length; i++) {
// 如果还是文件夹 递归获取里面的文件
if (files[i].isDirectory()) {
getFiles(files[i].getPath(),paraMap);
} else { //文件
paraMap.get("filePaths").add(files[i].getAbsolutePath());
paraMap.get("fileNames").add(files[i].getName());
}
}
}
return paraMap;
}
}
如果内容对大家有所帮助,感谢鼓励!实现我小时候一人给我一块钱的美梦,哈哈!