我正在创建文件和文件夹树。我正在重写多线程。我看到的唯一弱点是在创建文件夹时。现在,它一步一步地(深入)。在写下文件之前,我检查路径是否存在。如果没有,我将使用mkdirs创建所有丢失的东西。

public void checkDir(String relativePath) {
        File file = new File(homePath + relativePath);
        if (!file.exists()) {
            if (file.mkdirs()) {
                log.info("Directory: " + homePath + relativePath + " is created!");
            } else {
                log.error("Failed to create directory: " + homePath + relativePath + " !");
            }
        }
    }

我有一个问题,当我使用两个线程时会发生什么。一个具有路径A/B/C,另一个具有路径A/B/D。假设我只有一个文件夹,但没有B。因此,他们两个都将检查该路径不存在并想要创建它。因此,其中一个可能会失败,因为另一个会更快。那么我该如何管理呢?
  • 我正在考虑删除存在的条件并使其失败,但是我没有可以捕获的AlreadyExists异常。
  • 首先创建目录树(但我认为会有更好的方法吗?)
  • 将目录创建作为关键部分并使其按顺序进行-不确定在 Spring 如何进行此操作,但是无论如何要确保它是必要的,并且不会太慢。

  • 也许我想得太多,但是从理论上讲,这种情况可能会发生。当前,我使用常规Thread,但是我想为此使用spring TaskExecutor。它自己处理关键部分,但这不是共享变量或其他任何东西,并且路径不同,因此我认为它不会识别它。

    感谢您的建议。

    最佳答案

    指定了File.mkdirs()方法来创建目录及其所有父目录(如果不存在)。因此,调用exists().毫无意义,无论如何都会检查存在性。调用exists()只是浪费时间。 mkdirs()本质上是一个原子操作:试图超越它实际上没有任何意义。

    请注意,false的返回值不一定是失败的。它可能只是表明路径中的所有目录已经存在。

    基本上,您的问题的前提是错误的。

    09-11 18:53