父子JAVA:多个不在Linux中工作的JAVA应用程序之间的文件共享和锁定
我有两个独立的Java进程。说ABC和DEF。DEF是ABC的子级(也就是说,DEF是由ABC生成的。ABC和DEF分别使用两个jar文件ABC.jar和DEF.jar生成)。我的要求是保留一个ABC和DEF共用的文件。此文件由ABC创建,将被锁定。DEF检查文件是否已解锁。如果解锁,则进程将退出。这是为了解决孤立进程的问题,其中父进程崩溃时子进程不会被杀死
因此,在这种情况下,ABC创建的文件将保持锁定状态,直到ABC退出。DEF已在检查文件的锁是否已释放。由于要释放的锁的条件是ABC终止,DEF将在ABC终止时立即终止
因此,我创建了一个文件锁。ABC过程中的java类:-
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.channels.FileLock;
public class FileLock {
public FileLockExample() throws FileNotFoundException {
FileOutputStream fileOutStream;
try {
fileOutStream= new FileOutputStream("Temp.txt");
FileLock fileLock ;
try {
fileLock = fileOutStream.getChannel().tryLock();
if (fileLock != null) {
System.out.println("Locked File");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
} catch (IOException e) {
e.printStackTrace();
}
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}
}
所以,一个临时文件。txt已创建并被锁定
现在,我在DEF中添加了一个函数,用于检查文件是否已锁定
public static void isFileUnlocked() {
Integer count = 1000;
boolean isFirstTry = false;
while (count > 0) {
try {
if (!isFirstTry) {
FileOutputStream fos = new FileOutputStream("Temp.txt");
FileLock fileLock = fos.getChannel().tryLock();
isFirstTry = true;
}
FileInputStream fis = new FileInputStream("Temp.txt");
fis.read();
System.exit(0);
} catch (IOException x) {
}
Thread.sleep(1000);
count--;
}
}
process DEF中的函数isFileUnlocked()检查文件锁是否每1秒释放一次。如果解除锁定,则表示ABC由于某些原因已终止。因此,一旦释放文件锁,DEF就会退出
我在Windows中验证了这一点,它似乎正在工作。然而,在Linux中,只要调用函数isFileUnlocked(),进程DEF就会存在。因此,当DEF尝试读取该文件时,它能够这样做。(这可能意味着该文件已解锁)
有什么想法吗
# 1 楼答案
假设在调用方法
checkIfFileIsUnlocked()
时[locked]文件未关闭,并且假设您正在使用正确的参数调用方法checkIfFileIsUnlocked()
,为了测试文件是否已锁定,您需要从文件中读取。仅打开文件不会引发异常这是一个写得很糟糕的示例,但它只是为了演示如何实现检查
当上面的代码运行时,下面的一行抛出一个异常
例外情况是: