Java 如何让一次只运行一个应用程序实例?

Java 如何让一次只运行一个应用程序实例?,java,javafx,singleton,Java,Javafx,Singleton,我正在开发一个使用JavaFX(不是fxml)并作为JAR导出的GUI应用程序。对于速度较慢的机器,不耐烦的用户多次单击JAR,应用程序的多个实例就启动了 我正在寻找一种解决方案,使系统上一次只能运行一个实例,如果用户在应用程序运行时再次单击,则不会发生任何事情。我认为它叫做singleton,但不知道如何实现它。我使用的一个简单解决方案是,当启动应用程序时,它会创建一个文件(我将其命名为.lock,但您可以随意调用),除非该文件已经存在,在这种情况下,应用程序将终止其执行,而不是创建文件。您可

我正在开发一个使用JavaFX(不是fxml)并作为JAR导出的GUI应用程序。对于速度较慢的机器,不耐烦的用户多次单击JAR,应用程序的多个实例就启动了


我正在寻找一种解决方案,使系统上一次只能运行一个实例,如果用户在应用程序运行时再次单击,则不会发生任何事情。我认为它叫做singleton,但不知道如何实现它。

我使用的一个简单解决方案是,当启动应用程序时,它会创建一个文件(我将其命名为
.lock
,但您可以随意调用),除非该文件已经存在,在这种情况下,应用程序将终止其执行,而不是创建文件。

您可以尝试。这是一个开源库,完全按照您的要求运行。将
junique-1.0.4.jar作为库导入到项目中。它只是10kb的文件

它清楚地描述了如何在项目中实现它。对于JavaFX应用程序,实现如下所示:

确保将这些类导入到主目录中

import it.sauronsoftware.junique.AlreadyLockedException;
导入it.sauronsoftware.junique.junique;
publicstaticvoidmain(字符串[]args){
字符串appId=“myapplicationid”;
布尔运算;
试一试{
获取锁(appId);
alreadyRunning=false;
}捕获(ALREADYLOCKEDEXE){
alreadyRunning=true;
}
如果(!alreadyRunning){

发射(args);//如果您将JavaFX代码正确地打包为一个真正的应用程序,而不是仅仅将其放入一个jar中,您可能会免费获得该功能,而不需要所有这些黑客。如果我使用jpackage工具在Mac上打包JavaFX代码,结果将是一个功能齐全的macOS应用程序。这意味着,当我双击它的图标时在某些情况下,只会启动应用程序的一个实例。这是Mac上的默认行为,正确打包的JavaFX应用程序也会遵守该规则。但是,我不能说Windows或Linux上的行为是什么,因为我目前没有运行这样的框。也许知道的人可以将其添加为注释

您需要将应用程序与资源绑定。它可以是文件、端口等。 您可以在启动时更改代码以检查文件是否已锁定。下面的代码将为您提供一些信息

FileOutputStream foStream = new FileOutputStream("/tmp/testfile.txt");
FileChannel channel = fileOutputStream.getChannel();
FileLock lock = channel.lock();

这对你们有帮助吗?我听说过插座,但从未使用过,若有帮助,我会告诉你们。“对于速度慢的机器,不耐烦的用户在JAR上点击多次,”如果应用程序启动很长时间,请考虑显示一个启动屏幕,以便用户知道它已经启动。当前JAR在文档文件夹中,但是在应用程序启动时,我没有看到任何文件被创建。也许我正在寻找错误的地方!@瑞德汉姆,嗯,你正在创建任何文件吗?因为这就是我的意思:你创建文件。在你的程序中,如果它不存在,如果它存在,你只需自动退出该程序。这样,即使用户多次单击同一个罐子,它也只会工作一次。现在我明白了你的意思,它可能会工作。但可能会有更好的解决方案。顺便说一句,谢谢。谢谢,这正是我想要的。它完全按照我的预期工作。好吧,这个应用程序我它不是个人项目,所有者希望使用Ant构建和导出它。因此,正确打包可能会有所帮助,但目前在这里不是一个选项。感谢您的帮助。