ich versuche, eine Datei zu sperren und unten, um es mit dem Code schreiben:Warum passiert beim Sperren einer Datei eine OverlappingFileLockException?
public class TrainSetBuildTask implements Runnable {
private String pathname;
public TrainSetBuildTask(String pathname){
this.pathname = pathname;
}
@Override
public void run() {
try {
String content = "content\n";
//write to a file
FileOutputStream os = new FileOutputStream(new File(pathname), true);
FileChannel channel = os.getChannel();
FileLock lock = channel.tryLock();
if (lock != null) {
ByteBuffer bytes = ByteBuffer.wrap(content.getBytes());
channel.write(bytes);
lock.release();
}
channel.close();
os.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
Und neue zwei Gewinde mit Instanzen der Klasse:
String pathname = "/home/sjtu123/test.arff";
TrainSetBuildTask task1 = new TrainSetBuildTask(pathname);
Thread t1 = new Thread(task1);
TrainSetBuildTask task2 = new TrainSetBuildTask(pathname);
Thread t2 = new Thread(task2);
t1.start();
t2.start();
Dann erhalte ich die Fehler OverlappingFileLockException. Ich frage mich, warum das passiert, da ich die Datei nur einmal in jedem Thread sperre? Wie kann ich meinen Code reparieren?
Dann was ist die Verwendung von 'FileLock', da es nicht verwendet werden kann, um die Threads zu koordinieren, die Datei schreiben will? @Attila –
Es soll verhindern, dass andere (z. B. andere Programme) gleichzeitig mit der Datei, die die Sperre enthält, auf die Datei zugreifen. Die Ausnahme gibt an, dass eine andere Person (in diesem Fall einer Ihrer eigenen Threads) die Datei bereits gesperrt hat. Wenn Sie (aus der Perspektive Ihres Programms) nicht aufgeben wollen, können Sie es später versuchen, zum Beispiel in der Hoffnung, dass zu diesem Zeitpunkt die Sperre aufgehoben wird. – Attila
Ich habe das Handbuch gelesen, bevor ich diesen Code oben schreibe und verstehe nicht die Bedeutung von ihnen. Jetzt verstehe ich es, danke. @Attila –