同时处理目录和子目录中的文件

时间:2018-10-23 19:02:14

标签: java multithreading concurrency executorservice

我有一个检查目录中文件是否包含字符串的功能

boolean processFiles(File file, String phrase) {
      if (file.isFile()) {
        return fileContains(file, phrase);
      }

      try (DirectoryStream<Path> stream = Files.newDirectoryStream(file.toPath())) {
        for (Path entry: stream) {
          if (processFiles(entry.toFile(), phrase) {
            return true;
          }
        }
      }
      return false;
}

如果我有许多目录,子目录和文件,如何使用并发性来提高性能?

我试图创建一个用于处理每个子目录的线程,但是如果有很多嵌套的子目录,我会用光线程

在我们有很多子目录的情况下,使用固定大小的线程池也是有问题的 在此处使用线程以提高性能的最佳方法是什么?

1 个答案:

答案 0 :(得分:3)

  

在我们有很多子目录的情况下,使用固定大小的线程池也是有问题的

那是一个假设,这很简单:错误。

假定,限制因素是线程数。但是,是什么让您这样想呢?此操作的 other 元素很有可能会限制整体性能,例如分别操作文件系统活动。准确地说:文件系统下方的驱动器系统。

您知道,仅通过向它们抛出(无限个)线程,就不可能使任意问题变得更快。

如果您对性能认真,请停止做假设。而是开始测量。测试1个线程需要多少时间来“处理”更大的树。重复执行此操作(最有可能的文件系统缓存将在此处发挥重要作用)。然后查看使用固定线程池时发生的变化。

我的假设 是:您会看到一定的加速,但是很快,添加更多线程将再次减慢速度。在这里猜测:最多4个线程的池可能会为您带来“最佳”结果。

在实现上比较明智,您可以将需要爬网的“新”子目录放在队列中,然后您的工作线程将它们从队列中取出进行处理。