如何确保只能执行我的程序的一个实例?

时间:2009-09-27 00:26:07

标签: java jar

我希望我的程序,Java可执行文件.jar只运行一次。我制作了一个程序,但现在我希望用户不能打开多个实例....感谢您的时间......

我已经检查了服务器/客户端解决方案和锁定文件,但我对它们了解不多,我还试图让它们在NetBeans中运行,没有运气......

6 个答案:

答案 0 :(得分:7)

您可以使用锁定文件解决方案。在启动应用程序时,请检查特定文件。如果它不存在,请创建它并正常启动应用程序。如果确实存在,请退出该应用程序。您需要确保在应用程序关闭时删除文件(可能使用FileLock)。

答案 1 :(得分:7)

您可以使用套接字 - ServerSocket只能侦听尚未使用的端口。第一次启动在端口上成功创建了一个ServerSocket实例 - 当该程序正在运行时,不能在该端口上成功创建其他ServerSocket。

import java.io.IOException;
import java.net.ServerSocket;

public class OneInstance {

    private static ServerSocket SERVER_SOCKET;

    public static void main(String[] args) {
        try {
            SERVER_SOCKET = new ServerSocket(1334);
            System.out.println("OK to continue running.");
            System.out.println("Press any key to exit.");
            System.in.read();
        } catch (IOException x) {
            System.out.println("Another instance already running... exit.");
        }
    }
} 

答案 2 :(得分:0)

您可以通过编程方式提取jar文件http://www.devx.com/tips/Tip/22124,更新一个文件以阻止应用程序再运行,然后重新启动它。

另一种选择是从jar文件中删除一些关键类,但这些都不会阻止它再次运行,因为它们可以复制jar文件。

您无法更新注册表,因为没有独立于平台的方法。

答案 3 :(得分:0)

Java Web Start可以独立于平台的方式处理这个问题,但是您需要让Java Web Start启动您的程序,这需要一些修补。

请参阅http://download.java.net/jdk7/docs/technotes/guides/javaws/developersguide/examples.html#SingleInstanceService了解如何让单个实例处理多个“启动我”请求。

答案 4 :(得分:0)

它还取决于“多个实例”的含义。

  1. 每台机器一次 - > tcp / mailslot / 原子/固定路径
  2. 每位用户一次 - >用户homedir中的锁定文件
  3. 一旦用户会话 - >再来一点 复杂,更依赖 平台

答案 5 :(得分:0)

Launch4j http://sourceforge.net/projects/launch4j/中有一个选项可以限制java应用程序的单个实例。在为java应用程序创建包装器时,第四个选项卡中提供了该部分。