【问题标题】:How to let run only one instance of application at a time?如何让一次只运行一个应用程序实例?
【发布时间】:2023-03-05 19:19:01
【问题描述】:

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

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

【问题讨论】:

  • 这对您有帮助吗? stackoverflow.com/questions/28642972/…
  • 我听说过sockets但没用过,如果有帮助我会告诉你的。
  • “对于慢速机器,不耐烦的用户在 JAR 上点击不止一次,”。如果应用程序需要很长时间才能启动,请考虑显示一个启动屏幕,以便用户知道它已启动。

标签: java javafx singleton


【解决方案1】:

你可以试试JUnique。它是一个开源库,完全符合您的要求。将junique-1.0.4.jar 作为库导入您的项目。它只有 10kb 的文件。

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

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

import it.sauronsoftware.junique.AlreadyLockedException;
import it.sauronsoftware.junique.JUnique;
    public static void main(String[] args) {

        String appId = "myapplicationid";
        boolean alreadyRunning;
        try {
            JUnique.acquireLock(appId);
            alreadyRunning = false;
        } catch (AlreadyLockedException e) {
            alreadyRunning = true;
        }
        if (!alreadyRunning) {
            launch(args); // <-- This the your default JavaFX start sequence 
        }else{ //This else is optional. Just to free up memory if you're calling the program from a terminal.
            System.exit(1);
        }
    }

【讨论】:

  • 谢谢,这正是我想要的。它完全符合我的预期。
【解决方案2】:

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

【讨论】:

  • 当前 JAR 位于 Documents 文件夹中,但我没有看到应用程序启动时创建任何文件。也许我看错地方了!
  • @Ridham 好吧,你在创建任何文件吗?因为这就是我的意思:如果文件不存在,则在程序中创建该文件,如果存在,则只需自动退出程序。这样,即使用户多次点击同一个 jar,它也只会工作一次。
  • 现在我明白你的意思了,它可能会奏效。但可能有更好的解决方案。顺便说一句,谢谢。
【解决方案3】:

您需要将您的应用程序与资源绑定。它可以是文件、端口等。 您可以在启动时更改代码以检查文件是否被锁定。下面的代码会给你一些想法

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

【讨论】:

    【解决方案4】:

    如果您将 JavaFX 代码正确地打包为真正的应用程序,而不是仅仅将其放入 jar 中,那么您可能会免费获得该功能,而无需使用所有这些 hack。如果我使用 jpackage 工具在我的 Mac 上打包我的 JavaFX 代码,结果将是一个功能齐全的 macOS 应用程序。这意味着当我在某处双击它的图标几次时,只会启动应用程序的一个实例。这是 Mac 上的默认行为,正确打包的 JavaFX 应用程序也遵守该规则。但是我不能说 Windows 或 Linux 上的行为是什么,因为我目前没有运行这样的盒子。也许知道的人可以将此添加为评论。

    【讨论】:

    • 嗯,这个应用程序不是个人项目,所有者希望使用 Ant 构建和导出它。因此,适当的包装可能会有所帮助,但目前这里不是一个选择。感谢您的帮助。
    猜你喜欢
    • 2011-05-10
    • 1970-01-01
    • 2010-10-29
    • 2017-07-01
    • 2011-07-20
    • 2018-08-20
    • 1970-01-01
    相关资源
    最近更新 更多