我有一些代码用命令行运行java.exe来启动游戏。由于我没有玩家同时启动多个游戏程序实例,所以我需要检查游戏是否一直在运行。
对于普通的exe文件,我可以从进程信息中获取exe路径。但对于java游戏,执行文件路径始终是java.exe
或javaw.exe
的路径。所以我想要获取命令行信息以使jar文件运行。但是我无法获得命令行的原因是:
请记住,从Win32的角度来看,命令行只是一个复制到新进程的地址空间的字符串。启动过程和新过程如何解释此字符串不是由规则控制,而是按惯例控制。
所以,我需要另一种方法来做这样的事情,但我想不出任何方法来区分两个java进程。有人可以给我一些提示吗?
答案 0 :(得分:4)
您不必从发射器运行java.exe
。相反,您的启动程序可以使用Invocation API创建进程内JVM。这样,您可以检查可执行路径,检查命令行,创建命名互斥锁或执行任何操作,而无需依赖外部Java启动程序。
另一个解决方案是使用Jvmstat Performance Counters查找系统中其他Java进程的主类,参数和VM选项,就像jps
和jcmd
一样。这个想法是每个Java进程(除非使用-XX:+PerfDisableSharedMem
运行)将某些运行时信息导出为用户的Temp\hsperfdata_user
文件夹中的内存映射文件。因此,您可以检查这些文件,看它们是否属于游戏。
答案 1 :(得分:0)
我猜您可以将JVM参数作为“-Dservice.name”传递。然后从启动文件(.bat或.sh文件)开始,再次启动它之前,您可以检查进程是否已经与service.name一起运行。并据此做出决定。