Java 使用多少线程更好?(爪哇)

Java 使用多少线程更好?(爪哇),java,performance,path-finding,Java,Performance,Path Finding,我制作应用程序。它搜索具有特殊扩展名的文件。我使用多线程:在每个目录(小任务)上,我创建一个线程,使其工作: /** * Explore given directory. * @param dir - directory to explore. * @return snapshot of directory - FilesAndDirs object, * which encapsulates information about directory. */ public final F

我制作应用程序。它搜索具有特殊扩展名的文件。我使用多线程:在每个目录(小任务)上,我创建一个线程,使其工作:

/**
 * 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);
}
/**
*浏览给定的目录。
*@param dir-要浏览的目录。
*@return目录快照-FilesAndDirs对象,
*它封装了有关目录的信息。
*/
公共最终文件和目录exploreDirectory(最终文件目录){
最终列表子目录=新的ArrayList();
最终列表文件=新的ArrayList();
if(dir.isDirectory()){
final File[]children=dir.listFiles();
如果(子项!=null){
用于(文件子项:子项){
if(child.isFile()&&!child.ishiden()
&&检查扩展名(子){
文件。添加(子文件);
}否则{
if(child.isDirectory()&&!child.ishiden()){
添加(子目录);
}
}
}
}
}
返回新的filesanddir(文件、子目录);
}
这个方法对给定的目录进行快照,并像FilesAndDirs对象一样返回结果,该对象保存列表文件和列表子目录。在另一个方法(getFiles())中,我有列表文件-具有给定扩展名的文件-是搜索的结果,第二个列表目录-它包含explore方法的每个目录的子目录。
因此,每个线程探索目录,将具有给定扩展名的文件放入结果列表,将给定目录的子目录放入子目录列表,然后我们将其添加到getFiles()方法的目录列表中。我使用固定线程池,但问题是我应该使用多少线程才能获得更好的性能? 我读到,如果任务不是IO密集型的,我应该使线程数等于可用内核数Runtime.getRuntime().availableProcessor()。 现在探索C:和D:目录所需的时间是41秒。但也许我应该使用更多的线程或使用一些“神奇”类导入java.util.concurrent。
下面是getFiles()方法:

从硬盘读取是顺序的,所以这里的多线程处理效率不高。您的方法受到硬盘上I/O操作的限制。不在CPU能力上。

但您的任务大量使用I/O。因此,您可以将线程数增加到可用处理器/内核数,但我甚至不确定这是否有效,因为您在CPU上花费的时间很少,而在I/O上花费的时间很多。当您多次访问I/O时,由于需要订购更多的请求,因此会产生较小的开销(因为它安装在带有SSD的智能手机上,所以不存在头部移动的问题),您需要在多个不同的设备上对其进行基准测试,以了解情况。即使有很多CPU核,I/O受限的东西在大多数设备上也可能给出类似的结果。