如何允许Java程序一次只运行一个实例?

2024-04-22

我需要防止用户多次启动我的 Java 应用程序(WebStart Swing 应用程序)。因此,如果应用程序已经在运行,则不应再次启动它或显示警告/再次关闭。

有没有一些方便的方法来实现这一目标?我考虑过阻止端口或将某些内容写入文件。但希望您可以访问一些系统属性或 JVM?

顺便提一句。目标平台是带有 Java 1.5 的 Windows XP


我认为您在启动应用程序时打开一个端口进行监听的建议是最好的主意。

这很容易做到,您无需担心关闭应用程序时清理它。例如,如果您写入文件,但有人使用任务管理器终止进程,则该文件不会被删除。

另外,如果我没记错的话,没有简单的方法可以从 JVM 内部获取 Java 进程的 PID,所以不要尝试使用 PID 制定解决方案。

像这样的事情应该可以解决问题:

private static final int PORT = 9999;
private static ServerSocket socket;    

private static void checkIfRunning() {
  try {
    //Bind to localhost adapter with a zero connection queue 
    socket = new ServerSocket(PORT,0,InetAddress.getByAddress(new byte[] {127,0,0,1}));
  }
  catch (BindException e) {
    System.err.println("Already running.");
    System.exit(1);
  }
  catch (IOException e) {
    System.err.println("Unexpected error.");
    e.printStackTrace();
    System.exit(2);
  }
}

此示例代码显式绑定到127.0.0.1这应该避免任何防火墙警告,因为该地址上的任何流量都必须来自本地系统。

选择端口时,请尽量避免使用中提到的端口知名港口列表 http://www.iana.org/assignments/port-numbers。理想情况下,您应该在文件中或通过命令行开关配置所使用的端口,以防发生冲突。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何允许Java程序一次只运行一个实例? 的相关文章

随机推荐