3

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

代码基本上看起来像这样

Runtime.exec(....);

System.exit(0);

99.8% 的时间,这工作得很好。但非常偶尔地,bat 文件不会运行。

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

我查看了 Runtime.exec 的源代码,但它会放入本机代码中来做有趣的事情。

编辑

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

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

编辑2

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

4

5 回答 5

2

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

于 2012-05-11T19:00:34.473 回答
1

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

于 2012-05-11T19:07:02.190 回答
0

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

于 2012-05-11T19:03:40.153 回答
0

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

于 2012-05-11T19:39:30.620 回答
0

将其更改为

Runtime.getRuntime().exec(....).waitFor();

System.exit(0);

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

于 2012-05-11T20:07:14.513 回答