ユーザーが Java アプリケーションを複数回並行して実行することを防ぎたいです。
これを防ぐために、アプリケーションを開くときにロック ファイルを作成し、アプリケーションを閉じるときにロック ファイルを削除します。
アプリケーションの実行中は、jar の別のインスタンスを開くことはできません。ただし、タスク マネージャーを使用してアプリケーションを強制終了すると、アプリケーションのウィンドウを閉じるイベントはトリガーされず、ロック ファイルは削除されません。
ロック ファイル メソッドが機能することを確認するにはどうすればよいですか、または他にどのようなメカニズムを使用できますか?
ベストアンサー1
FileLock を使用することもできます。これは、複数のユーザーがポートを共有する環境でも機能します。
String userHome = System.getProperty("user.home");
File file = new File(userHome, "my.lock");
try {
FileChannel fc = FileChannel.open(file.toPath(),
StandardOpenOption.CREATE,
StandardOpenOption.WRITE);
FileLock lock = fc.tryLock();
if (lock == null) {
System.out.println("another instance is running");
}
} catch (IOException e) {
throw new Error(e);
}
ガベージ コレクションも生き残ります。プロセスが終了するとロックが解除されます。通常の終了、クラッシュなど、何であっても問題ありません。