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

问题描述 投票:0回答:5

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

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

java javafx singleton
5个回答
2
投票

你可以尝试JUnique。它是一个开源库,完全可以满足您的要求。将

junique-1.0.4.jar
作为库导入到您的项目中。这只是 10kb 文件。

它的手册巧妙地描述了如何在项目中实现它。对于 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);
        }
    }

1
投票

我使用的一个简单的解决方案是,当您启动应用程序时,它会创建一个文件(我将其命名为

.lock
,但您可以随意命名它),除非该文件已经存在,在这种情况下应用程序将终止它的执行而不是创建文件。


1
投票

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

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

0
投票

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


0
投票

这些对我都没有帮助。我的所有计算机上都有 Paint Shop Pro,它会在除一台计算机之外的所有计算机上打开一个实例。对于所有其他的,我可以双击资源管理器中的图像,它会将该图像添加到已经打开的 Paint Shop Pro 中。但在一台计算机上,它会打开一个单独的实例。

相同的 Paint Shop Pro(旧版本 - 版本 7)和相同的操作系统,Windows 10。神秘。

© www.soinside.com 2019 - 2024. All rights reserved.