在多线程环境中,我面临着一类麻烦。 尽管这段代码已经很老了,并且已经运行了很长时间了。
其中一个人抱怨说他们面临着类似的问题。甚至 尽管由一个线程创建的文件存在,但另一个线程说不 文件存在。
我提供了解决问题的示例方法。
/**
* Creates a temporary directory. Will be deleted when the program closed if it
* is empty!
*
* @return the temporary directory
* @throws com.osm.exception.WMException if there is a problem
*/
public static File createTempDir() throws WMException {
synchronized (pdm.semaphore) {
try {
final File parent = WMSession.getWMSession().getRootTempDir();
if (!parent.exists()) {
throw new IllegalStateException(parent + " does not exist"); //frozen
}
final File tmpDirectory = File.createTempFile("WMTempDir", "", parent); //frozen
tmpDirectory.delete();
tmpDirectory.mkdirs();
logFileCreated(tmpDirectory);
return tmpDirectory;
} catch (final IOException ioe) {
throw new WMException(ioe);
}
}
}
此代码从另一个方法代码中调用,如下所示。
void copy_from_db2_using_temp_dir(String phys_name, int storage_type, int store_date, int file_flag,
String directory, String file_name) throws WMException {
final File destDir = new File(directory);
if (!destDir.exists()) {
// no conflict possible since destination directory does not yet exist.
pdm.copy_from_db2(phys_name, storage_type, store_date, file_flag, directory, file_name);
return;
}
final File tmpDir = WMFile.createTempDir();
final File tmpDestFile = new File(tmpDir, file_name);
final File destFile = new File(directory, file_name);
try {
final boolean destFileExistsFlag = destFile.exists();
if (destFileExistsFlag && (file_flag != DEL_OLD)) {
final String msg = pdm.fix_mesg(pdm.catgets("data_mgr", 266, "*** ERROR: Cannot overwrite file '{1}'"),
destFile.getAbsolutePath());
throw new WMException(msg);
}
pdm.copy_from_db2(phys_name, storage_type, store_date, file_flag, tmpDir.getAbsolutePath(), file_name);
if (tmpDestFile.isFile() && destFile.isDirectory()) {
final String msg = pdm.fix_mesg(pdm.catgets("data_mgr", 269, "*** ERROR: Could not remove file '{1}'"),
destFile.getAbsolutePath());
throw new WMException(msg);
}
moveFiles(tmpDestFile, destFile, (file_flag == DEL_OLD));
} finally {
deleteTempDir(tmpDir);
}
}
另一个线程/进程总是得到条件
!parent.exists()
是。这是不正确的,因为它必须获得父项
文件。
需要建议输入或任何有助于了解是否 调用在代码中有问题或有问题。
我在StackOverflow上得到了一些东西,但不确定是否相关 这里。 File.exists() issue in multi threaded env
答案 0 :(得分:0)
if (!parent.exists()) {
。这与多线程无关。
示例:
可以说我们正在尝试使用C:\myGame\logs
方法创建文件夹createTempDir
。您的代码将首先测试以查看C:\myGame
是否存在。如果不存在,则您的代码将引发非法状态异常,并且不会继续执行。
换句话说:您要在其中创建logs
目录的父目录不存在。这可能是由于多种原因造成的:
WMSession.getWMSession().getRootTempDir()
的配置不正确:它指向错误的文件路径。
也许您甚至不需要断言父目录存在。因为您在代码中调用mkdirs()
,所以logs
目录的所有必需祖先目录都会自动创建。
您可以考虑以下解决方案:
正确配置WMSession
,使其指向正确的文件夹,并假设您希望在执行代码之前先存在父目录。
根本不关心父目录是否存在,因为mkdirs
会为您处理。