防止启动 Java 应用程序的多个实例

2022-09-01 11:47:38

我想防止用户多次并行运行我的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);
}

也幸存下来 垃圾回收。一旦您的流程结束,锁定就会被释放,无论常规退出还是崩溃或其他任何事情都无关紧要。


答案 2

类似的讨论正在 http://www.daniweb.com/software-development/java/threads/83331

绑定服务器袜子。如果它无法绑定,则中止启动。由于 ServerSocket 只能绑定一次,因此只能运行该程序的单个 instances。

在你问之前,没有。仅仅因为您绑定了ServerSocket,并不意味着您对网络流量持开放态度。只有当程序开始使用 accept() “监听”端口时,这才会生效。


推荐