所以我把我的项目打包成一个可行的单个可执行jar。但有时会发生用户多次启动文件,这会导致它启动同一项目的多个实例(导致意外行为,例如通过延迟的项目实例覆盖文件中的值)。
我想知道一个Windows平台(Win7),有什么选项可以锁定执行一次,然后如果jar已经运行,就不要再继续执行代码了。
我读过有关进程ID的信息,但是如果有多个java应用程序,他们最终都会将imagename显示为javaw.exe,我如何确定自己的进程ID?
请说明做这件事的正确方法是什么,谢谢!!
答案 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,并在应用程序关闭时关闭它。
如果某个实例已在运行,您将获得“正在使用的端口”例外。