Java Runtime.exec被System.exit杀死?

Java Runtime.exec被System.exit杀死?,java,runtime.exec,system.exit,Java,Runtime.exec,System.exit,我有一个java程序,它应该运行一个bat文件,然后以成功代码0退出 代码基本上如下所示 Runtime.exec(....); System.exit(0); 99.8%的情况下,这是完美的。但bat文件偶尔无法运行 我的理论是,在某些系统上,Runtime.exec无法在System.exit运行之前完成其生成。这可能吗 我查看了Runtime.exec的源代码,但为了做一些有趣的事情,它会插入本机代码 编辑 根据到目前为止的答案,我应该声明.bat文件使用javaw执行另一个java进

我有一个java程序,它应该运行一个bat文件,然后以成功代码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


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

尝试更改为。也许它工作得更好。

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

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

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

将其更改为

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

System.exit(0);

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

为什么效果会更好?这只是创建
进程
实例的另一种方法。我不知道。也许这是一个不同的底层本机实现。这只是一个想法。这里不需要javaw,Process类就足够了,而不是Runtime类。