防止启动 Java 应用程序的多个实例
2022-09-01 11:47:38
我想防止用户多次并行运行我的Java应用程序。
为了防止这种情况,我在打开应用程序时创建了一个锁定文件,并在关闭应用程序时删除了锁定文件。
当应用程序正在运行时,您无法打开另一个 jar 实例。但是,如果通过任务管理器终止应用程序,则不会触发应用程序中的窗口关闭事件,也不会删除锁定文件。
如何确保锁定文件方法有效或可以使用其他什么机制?
我想防止用户多次并行运行我的Java应用程序。
为了防止这种情况,我在打开应用程序时创建了一个锁定文件,并在关闭应用程序时删除了锁定文件。
当应用程序正在运行时,您无法打开另一个 jar 实例。但是,如果通过任务管理器终止应用程序,则不会触发应用程序中的窗口关闭事件,也不会删除锁定文件。
如何确保锁定文件方法有效或可以使用其他什么机制?
您可以使用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);
}
也幸存下来 垃圾回收。一旦您的流程结束,锁定就会被释放,无论常规退出还是崩溃或其他任何事情都无关紧要。
类似的讨论正在 http://www.daniweb.com/software-development/java/threads/83331
绑定服务器袜子。如果它无法绑定,则中止启动。由于 ServerSocket 只能绑定一次,因此只能运行该程序的单个 instances。
在你问之前,没有。仅仅因为您绑定了ServerSocket,并不意味着您对网络流量持开放态度。只有当程序开始使用 accept() “监听”端口时,这才会生效。