有多少线程更好用? (Java)的

时间:2012-02-14 20:14:34

标签: java performance path-finding

我制作应用。它搜索具有特殊扩展名的文件。我使用多线程:在每个目录(小任务)上我创建一个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

1 个答案:

答案 0 :(得分:4)

从硬盘读取是顺序的,因此这里的多线程效率不高。您的方法受硬盘驱动器上的I / O操作限制。不是你的CPU能力。