我有ArrayList
。它包含大约 20,000 个文件路径元素。
private List<Path> listOfPaths = new ArrayList<>();
我想以多线程模式读取这些路径上的文件内容。
问题是这段代码运行得很慢。我如何选择多个线程,以便每个线程都读取文件并将其写入dto
?如何解决一个线程开始处理文件而另一个线程不会对同一个文件执行相同操作的问题?
最佳答案
您可以将工作分成更小的 block ,每个线程处理所有文件的一部分。每个线程都有自己的要处理的数据子列表和已处理数据列表,以避免尝试同时读取/写入相同数据的任何风险。当所有线程完成后,您将收集结果。
实际上,您可以让 java 8 并行流为您完成拆分/合并等艰苦工作。
使用标准流而不使用多线程:
List<ParamsDTO> paramsList = listOfPaths.stream().map(p -> readFile(p)).collect(Collectors.toList());
使用并行流来提高性能:
List<ParamsDTO> paramsList = listOfPaths.parallelStream().map(p -> readFile(p)).collect(Collectors.toList());
您将 readFile 函数定义为:
public ParamDTO readFile(Path p) {
ParamsDTO params = new ParamsDTO();
params.setParams(Files.readAllBytes(path));
return params;
}
从长远来看,您可能希望超越这一点,根据磁盘类型控制并行级别,并获得更多控制,使用 Java 5 执行器来管理线程池特性和普通可运行或 future 用于运行任务。
关于java - 多线程模式下读取多个文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48732401/