仅运行可执行Jar文件的单个实例

时间:2012-01-21 14:42:37

标签: java executable-jar pid

所以我把我的项目打包成一个可行的单个可执行jar。但有时会发生用户多次启动文件,这会导致它启动同一项目的多个实例(导致意外行为,例如通过延迟的项目实例覆盖文件中的值)。

我想知道一个Windows平台(Win7),有什么选项可以锁定执行一次,然后如果jar已经运行,就不要再继续执行代码了。

我读过有关进程ID的信息,但是如果有多个java应用程序,他们最终都会将imagename显示为javaw.exe,我如何确定自己的进程ID?

请说明做这件事的正确方法是什么,谢谢!!

3 个答案:

答案 0 :(得分:3)

最简单的解决方案是使用固定的未使用端口。

ServerSocket ss;
try {
    ss = new ServerSocket(MY_PORT);
    // not already running.
} catch (BindException e) {
    // already running.
}

答案 1 :(得分:1)

根据我的经验,我使用的最佳方法是在特定端口上创建侦听ServerSocket(如61234)。套接字不执行任何操作,但如果您设法创建它,则意味着没有其他进程已启动。可执行jar文件的重复实例将无法在同一端口上创建ServerSocket,因此它们应该退出。

答案 2 :(得分:1)

您可以在应用程序启动时在专用TCP端口上打开ServerSocket,并在应用程序关闭时关闭它。

如果某个实例已在运行,您将获得“正在使用的端口”例外。