我有一个不寻常的过程结构:
问题是:Launch4J创建的互斥锁仅在VB6应用程序终止后才会释放。因此,再也无法启动Java应用程序。
为什么会这样?我没有明确地打开互斥锁...
我首先怀疑这是因为Java使用CreateProcess
和bInheritHandles == true
,但是当我启动notepad.exe
时问题不会出现。
编辑:我还有这个问题。任何指针都表示赞赏!
答案 0 :(得分:1)
在终止之前,Launch4J是否会释放互斥锁并关闭其句柄?对不起,我不知道Java如何包装OS Mutex函数,但是你应该确保在线程结束之前显式释放互斥锁并关闭它的句柄。
答案 1 :(得分:1)
我遇到了同样的问题,并且意识到Launch4J在启动时创建了一个可继承的互斥体,并且从JVM启动进程时,该互斥体随后被新进程继承。
JVM关闭后,互斥锁仍由新进程保留。
我发现避免互斥量被继承的最简单解决方案是使用一个中间程序,该程序在不继承父句柄的情况下将进程作为独立进程启动。
可以在这里https://stackoverflow.com/a/1582197/6894604
找到该程序的有效c ++示例。只需使用c ++编译器编译程序(“ ex:rujob.exe”),然后将命令更改为使用启动器,而不是直接调用进程即可,例如:
new ProcessBuilder().command(
"runjob.exe",
"vbprogram.exe",
"/PARAM1",
"/PARAM2").start();
这样,您的VB程序将不会继承Java应用程序互斥体,也不会阻止Java应用程序再次启动。
答案 2 :(得分:0)
为什么不使用VB而不是Java提供单实例功能? IMO是错误的,使用Launch4j为VB应用程序提供单个实例。还有其他方法,请检查以下内容: