Runtime.exec getting killed by System.exit?



我有一个Java程序,它应该运行一个bat文件,然后以成功代码0退出。

代码基本上看起来像这样

Runtime.exec(....);
System.exit(0);

99.8%的时间,这完美地工作。 但非常零星的是,蝙蝠文件不会运行。

我的理论是,在某些系统上,Runtime.exec 无法在 System.exit 运行之前完成其生成。 这可能/可能吗?

我查看了 Runtime.exec 的源代码,但它放入本机代码中以执行有趣的操作。

编辑

根据到目前为止的答案,我应该声明.bat文件使用 javaw 执行另一个 java 进程。 我可以确认第一个 java 进程结束不会杀死 bat 文件中运行的第二个进程。

问题发生时,bat 文件是否有可能在 System.exit 发生之前没有生成第二个 java 进程? 也许它毕竟不是 Runtime.exec 问题?

编辑2

不能等待第二个进程结束,它可以无限期运行,我的第一个进程必须退出。

尝试更改为 ProcessBuilder。也许效果更好。

您正在创建一个将与其父进程一起终止的子进程。您必须在 Java 中使用Process.waitFor来确保 Java 进程等待 bat 进程完成。

System.exit(0( 杀死 jvm 实例。所有进程都将终止。如果你想真正执行 System.exit(0(,请确保在调用 System.exit 之前完成 exec 进程。

使用

Process.waitFor((,此方法的返回类型为 int,它根据当前使用运行时的解决方案为您提供返回代码。
waitFor(( 使当前线程在必要时等待,直到此 Process 对象表示的进程终止。

将其更改为

Runtime.getRuntime().exec(....).waitFor();
System.exit(0);

但是,这将等待批处理文件完成执行,并在您的情况下完成javaw实例。

最新更新