我正在开发一款搜索特定扩展名文件的应用程序。我使用多线程技术:对于每个目录(小任务),我都会创建一个线程,线程执行以下工作:
/**
* Explore given directory.
* @param dir - directory to explore.
* @return snapshot of directory - FilesAndDirs object,
* which encapsulates information about directory.
*/
public final FilesAndDirs exploreDirectory(final File dir) {
final List<File> subDirectories = new ArrayList<File>();
final List<File> files = new ArrayList<File>();
if (dir.isDirectory()) {
final File[] children = dir.listFiles();
if (children != null) {
for (File child : children) {
if (child.isFile() && !child.isHidden()
&& checkExtension(child)) {
files.add(child);
} else {
if (child.isDirectory() && !child.isHidden()) {
subDirectories.add(child);
}
}
}
}
}
return new FilesAndDirs(files, subDirectories);
}
这个方法创建给定目录的快照,返回一个FilesAndDirs对象的结果,它包含List文件和List子目录。在另一个方法(getFiles())中,我有一个List文件 - 具有给定扩展名的文件 - 是搜索结果,第二个List目录 - 它包含每个目录的子目录以进行探索。
因此,每个线程都会浏览目录,将具有给定扩展名的文件放入结果列表中,将给定目录的子目录放入子目录列表中,然后我们将其添加到getFiles()方法的目录列表中。我使用固定的线程池,但问题是应该使用多少线程来获得更好的性能? 我读到,如果任务不涉及IO操作,我应该使线程数等于可用核心数 Runtime.getRuntime().availableProcessors()。 现在探索C:和D:目录所需的时间为41秒。但也许我应该使用更多的线程或使用一些“神奇”的类import java.util.concurrent。 这是getFiles()方法:getFiles() method