我正在创建文件和文件夹的树形结构。我正在重写为多线程。我唯一看到的弱点是创建文件夹时。现在它按深度一个一个地进行。在写入文件之前,我会检查路径是否存在。如果不存在,我使用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。假设我只有A文件夹存在,但没有B文件夹。因此,它们都将检查该路径不存在并想要创建它。因此,其中一个线程可能会失败,因为另一个线程速度更快。那么我该如何管理这种情况呢?
- 我考虑删除存在条件并让其失败,但没有已存在的异常可以捕获。
- 首先创建目录树(但我认为还有更好的方法?)
- 将目录创建作为关键部分,并使其顺序执行-不确定如何在Spring中执行此操作,但无论如何,也不确定是否必要,也不确定它是否会减慢进程速度太多。
也许我想得太多了,但理论上可能会发生这种情况。当前我使用常规Thread,但我想为此使用Spring TaskExecutor。它自己处理关键部分,但这不是共享变量或任何内容,路径也是不同的,因此我认为它不会识别它。
感谢您的建议。
Path
并使用Path
上的方法(如relativize
和resolve
)来处理这些路径。最后,使用Files
进行操作,因为它的错误处理要好得多。简而言之,请不要使用String
表示类型数据,也不要使用File
API。 - Boris the Spider