我制作应用。它搜索具有特殊扩展名的文件。我使用多线程:在每个目录(小任务)上我创建一个Thread,它做了这样的工作:
/**
* 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 subDir。在另一个方法(getFiles())中,我有List文件 - 具有给定扩展名的文件 - 是搜索结果和第二个List目录 - 它包含explore方法的每个目录的子目录。
因此,每个线程浏览目录,具有给定扩展名的文件,他将结果列表,给定目录的子目录放入子目录列表中,然后将其添加到getFiles()方法的目录列表中。我使用固定线程池,但问题是我应该使用多少线程来获得更好的性能?
我读过,如果任务不是IO密集型,我应该使 rarad的数量等于可用内核的数量 Runtime.getRuntime()。availableProcessors()。
现在花时间探索C:和D:目录是41秒。但也许我应该使用更多线程或使用一些&#34;魔法&#34; classes import java.util.concurrent。
这是getFiles()方法:getFiles() method
答案 0 :(得分:4)
从硬盘读取是顺序的,因此这里的多线程效率不高。您的方法受硬盘驱动器上的I / O操作限制。不是你的CPU能力。