如何一次只允许运行一个Java程序的实例?
2022-09-01 12:38:19
我需要防止用户多次启动我的 Java 应用程序(WebStart Swing 应用程序)。因此,如果应用程序已经在运行,则无法再次启动它或显示警告/再次关闭。
有没有一些方便的方法来实现这一目标?我想过阻止一个端口或将sth写入文件。但希望您可以访问一些系统属性或JVM?
顺便说一句。目标平台是Windows XP与Java 1.5
我需要防止用户多次启动我的 Java 应用程序(WebStart Swing 应用程序)。因此,如果应用程序已经在运行,则无法再次启动它或显示警告/再次关闭。
有没有一些方便的方法来实现这一目标?我想过阻止一个端口或将sth写入文件。但希望您可以访问一些系统属性或JVM?
顺便说一句。目标平台是Windows XP与Java 1.5
我认为您在启动应用程序时打开端口以进行侦听的建议是最好的主意。
这很容易做到,您无需担心在关闭应用程序时清理它。例如,如果您写入文件,但有人使用任务管理器终止了进程,则该文件不会被删除。
另外,如果我没记错的话,没有简单的方法可以从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
选择端口时,请尽量避免使用已知端口列表中提到的端口。理想情况下,您应该使所使用的端口可在文件中配置,或者在发生冲突时通过命令行开关进行配置。
由于问题指出正在使用WebStart,因此明显的解决方案是使用javax.jnlp.SingleInstanceService
。
此服务在 1.5 中可用。请注意,1.5 目前已过完其使用寿命结束期。使用 Java SE 6!