将文件/"folder"锁定到特定的 JVM,并在锁定时进行迭代



我正在使用多个JVM,但我需要每个JVM使用一个特定的文件夹。我正在尝试做的是遍历文件夹,直到找到未锁定的文件,然后将其锁定以使用该特定文件夹。

在这里,我正在过滤要使用的文件夹:

// Filter 'fran' folders
String dir = System.getProperty("user.dir");
FilenameFilter filter = new FilenameFilter() {
public boolean accept(File dir, String name) {
String lowercaseName = name.toLowerCase();
if (lowercaseName.startsWith("fran")) {
return true;
} else {
return false;
}
}
};
File[] dirs = new File(dir).listFiles(filter);

然后我尝试浏览文件夹并检查它是否已被锁定f.canWrite().但是,它似乎总是只使用一个文件夹而忽略其他文件夹。

// Find available folder
boolean lock = true;
String lock_folder = "";
FileChannel fileChannel = null;
FileLock lockfile = null;
File f = null;
while (lock) {
for (File folder : dirs) {
f = new File(folder + "\lock.txt");
Boolean isnotlocked = f.canWrite();
if (isnotlocked) {
fileChannel = new RandomAccessFile(f, "rw").getChannel();
lockfile = fileChannel.lock();
lock = false;
lock_folder = folder.getAbsolutePath();
break;
}
}
}

我+以前曾尝试在没有FileLock的情况下完成我需要的事情,在特定文件夹中创建一个文件,然后在完成后删除。如果文件夹没有该文件,它将创建并锁定该 JVM。但是,我认为JVM变得好坏参半,因为结果很糟糕。

希望你能理解我的问题是什么,非常感谢一些帮助。

这里有一些想法:

假设一个进程类 -CustomProcess.java.这将在单独的线程中运行。该类有一个构造函数,它将文件夹作为参数。假设filePath1是文件夹的路径,并且是从FileChooser接受的。

(a( 申请如何运作:

将选定的文件夹filePath1放在像List<File>List<Path>这样的集合中 - 我们称之为processFilesList;这是由所有进程共享的(可能是static成员((这需要是来自java.util.concurrent包的并发集合(。此列表跟踪已在处理的文件夹。在该过程开始之前,请检查filePath1是否已在processFilesList中。

(b( 创建并启动以下进程:

CustomProcess p1 = new CustomProcess(filePath1);
p1.startProcess(); // here the application does whatever with the files in the folder.


选项 2

将需要处理的所有文件夹文件路径放在Queue集合中。一次处理一个文件夹(及其文件(或由多个进程处理。队列可以是先进先出 (FIFO( 或后进先出 (LIFO(。可以根据以下要求考虑这些并发队列实现:ConcurrentLinkedQueueLinkedBlockingQueueConcurrentLinkedDequeLinkedBlockingDeque

相关内容

  • 没有找到相关文章

最新更新