【问题标题】:Runtime.exec getting killed by System.exit?Runtime.exec 被 System.exit 杀死?
【发布时间】:2012-05-11 18:57:22
【问题描述】:

我有一个 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 的问题?

EDIT2

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

【问题讨论】:

  • 这里不需要javaw,Process类代替Runtime类就足够了。

标签: java runtime.exec system.exit


【解决方案1】:

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

【讨论】:

  • 为什么会更好?这只是创建Process 实例的另一种方式。
  • 不知道。也许它是一个不同的底层原生实现。只是一个想法。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        【解决方案5】:

        改成

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2010-11-12
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-12-08
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多