Ich habe ein Java-Programm, das eine Sperrdatei erstellt, um sicherzustellen, dass keine anderen Ausführungen gleichzeitig ausgeführt werden. Wenn das Programm ausgeführt wird, erstellt es die Datei und beim Beenden entweder erfolgreich oder über eine Ausnahme wird die Datei entfernt. Wenn der Benutzer jedoch Strg + C drückt, das Terminal schließt oder die Ausführung auf andere Weise unterbricht, wird die Datei nicht gelöscht. Gibt es eine Möglichkeit, diesen Interrupt-Befehl zu erkennen und sicherzustellen, dass die Datei auch in diesem Fall gelöscht wird?Wie man Java mit Systeminterrupts umgehen lässt Wie Strg + C
Antwort
Vielleicht möchten Sie in shutdown hooks suchen. vor
Auch dies ist wahrscheinlich ein Duplikat oder nahezu Duplikat dieser früheren SO Frage von einem oder zwei Tagen:
Werden Shutdown-Hooks auch ausgeführt, wenn die JVM abnormal beendet wird? Ich würde es bezweifeln. –
@ mmyers, das hängt von Ihrer Definition von abnormal ab. :) Ctrl-C löst sie generell aus. Das Schließen des Terminals ist in der Regel nicht möglich. – jsight
Es gibt keine 100% idiotensichere Möglichkeit, solche Lockfiles zu löschen. Timestamping kann helfen, aber es kostet die Festplatte alle paar Sekunden zu schreiben. Viele Programme suchen beim Start einfach nach einer Sperrdatei und fordern den Benutzer dazu auf. – Amber
Die einzige gute Möglichkeit, um damit umzugehen ist Ihre Log-Datei zu , und aktualisieren Sie die Protokolldatei alle paar Sekunden mit einem neuen Zeitstempel. File.deleteOnExit wird helfen, aber keine Methode ist narrensicher (was passiert, wenn jemand nur das Netzkabel zieht?).
Wenn Sie einen Zeitstempel schreiben, können Sie nach einem gültigen Zeitstempel suchen (kürzlich geschrieben) und die Protokolldatei überschreiben, wenn sie zu veraltet ist. Auf diese Weise wird eine veraltete Sperrdatei dem Benutzer nicht in die Quere kommen.
- 1. Wie mit Java-Threads umgehen
- 2. Wie man iPhone mit Swift vibrieren lässt?
- 3. Wie Strg-Z, Strg-C Ausbrechen eines PHP-Skript
- 4. Wie man Spalte mit FluentMigrator fallen lässt?
- 5. In Java/Spring, wie man mit fehlenden Übersetzungswerten umgehen kann?
- 6. Wie mit codeabhängigen Klassen in C++ umgehen
- 7. Wie Sendkeys Funktion mit Strg + Alt + c
- 8. Wie man Elektronenprojekt laufen lässt
- 9. Wie kann man Pro * C mit Warnungsanweisungen umgehen?
- 10. Wie man mit Überlauf in C umgehen kann
- 11. Java Servlet: Wie mit unbekannten Codierungen umgehen?
- 12. Wie man Djangosellerie mit SQS laufen lässt?
- 13. Wie man Winkelmesser mit browserify laufen lässt?
- 14. Wie man mit Abrunden TimeSpan umgehen?
- 15. Wie kann man mit Sonderzeichen umgehen?
- 16. Wie man mit ThreadPool und Mitgliedsvariablen umgehen?
- 17. Wie man mit Cookies umgehen kann
- 18. Wie man mit Netzwerkumschaltung im iPhone umgehen?
- 19. Wie man Authentifizierungs-Popup mit Selenium WebDriver mit Python umgehen?
- 20. Wie deaktivieren Strg + A, Strg + C Tastenfunktionen in iframe
- 21. Wie man groovy Skript in Java laufen lässt?
- 22. Wie kann man Sonderzeichen umgehen?
- 23. Buffer trägt gespeicherten Anweisung mit Strg + C
- 24. Wie kann man Befehlszeilenargumente auf Powershell umgehen?
- 25. Wie man Fenster moderner aussehen lässt
- 26. Wie man mit verschiedenen Build-Typen in Xamarin umgehen kann
- 27. Wie man mit Schnittstellenfehlern in Eclipse umgehen kann
- 28. Wie ändert man Pycharm 'Kopieren' und 'Einfügen' Funktion in Strg + C und Strg + V?
- 29. Win32 API - Strg A + Strg C
- 30. Wie mit dieser NullPointerException umgehen?
Ironischerweise vergaß ich diese Frage und [beantwortete] (https://stackoverflow.com/a/34188676/113632) eine verwandte sechs Jahre (und damit verbundenen realen Erfahrung) später. @Amber hat absolut recht, dass die meisten Java-Anwendungen Shutdown-Hooks verwenden sollten, aber um * SIGINT' und andere Signale zu verarbeiten, müssen Sie 'sun.misc.Signal' verwenden, wie in der verknüpften Frage beschrieben. – dimo414