将此过程拆分为不同的线程是否可取?

时间:2012-07-24 17:05:38

标签: java multithreading directory

我有一个旨在在可移动设备上运行的Java应用程序。它的一个特点是它被设计为列出驱动器上的所有文件夹,但显然文件和文件夹越多,所需的时间就越多(无论计算机有多强大),移除设备越来越大,这些天来,我认为在这个过程中获得尽可能多的速度非常重要。

我知道最好/最快(在列表而不是编码方面)的方式是创建一个索引文件,但我认为这忽略了我的应用程序的全部意义。所以,我认为也许线程会有所帮助,因为从理论上讲,即使是两个也会使列表速度加倍,但我不知道这是否可能,如果是这样的话,怎么样?

任何答案都将不胜感激。这是我目前的递归方法:

private static void recursiveNodeCreation(DefaultMutableTreeNode node, String root){
        if(root==null) root = RUNNING_DRIVE = ".";

        try{
        // Get a list of files/folders in the root directory
        File rootDir = new File(root);

        File[] files = rootDir.listFiles();
        // Loop through the files/folders
        for(File current : files){
            if(Files.isReadable(current.toPath()) && !current.isHidden() && current.isDirectory()){
                DefaultMutableTreeNode folder = new DefaultMutableTreeNode(new FolderOnDrive(current.getName(), current.getPath()));
                recursiveNodeCreation(folder, current.getPath());
                node.add(folder);
            }
        }
        }catch(Exception e){e.printStackTrace();}
}

RUNNING_DRIVE保存运行应用程序的驱动器的驱动器号。我刚刚添加= "."以便在测试时更快。正如您可能已经猜到的那样,我列出了所有的JTree中的文件夹。)

2 个答案:

答案 0 :(得分:2)

如果可以并行执行多个操作,则线程化应用程序将提高应用程序的速度。例如,如果您是从单个网络连接进行读写,那么分叉线程是有意义的,这样您就可以同时处理其他连接。

但是,在您的情况下,我怀疑您受可移动设备维护IO请求的能力的限制。每个设备(包括内存)都具有最大数量的请求以及它可以在一段时间内处理的最大数据量 - 无论线程数量如何。记忆棒等众所周知地很慢,这就是为什么许多相机本身都有记忆的原因,随着时间的推移,它们可以在写入SD卡时快速拍摄许多照片。添加其他线程很可能无法提高整体应用程序性能,实际上可能会降低速度,因为IO请求将在存储驱动器的不同部分上运行并相互竞争。

使应用程序看起来更高效的一种方法是让一个线程在后台实际读取设备。然后您的UI可以向用户显示初始结果(如顶级目录),并在后台线程从设备读入时填写更多信息。

要测试是否是IO绑定,您应该在更快的硬盘驱动器上运行代码,以便将其目录递归速度与可移动设备进行比较。

答案 1 :(得分:1)

IO真的很慢。 This article describes how to tune File IO for performance,但由于您的程序没有读取任何文件的内容,我怀疑您是否可以加快速度。程序的瓶颈不在于列出文件的速度,它从设备中获取文件列表的速度有多快。

您可以根据需要添加任意数量的线程,瓶颈仍然是IO。