TreeviewCopyright © qgao 2021-* all right reserved, powered by aleen42

1 java里执行第三方脚本

When Runtime.exec() won't

简析 Runtime.exec(..)

java 程序中,如果我们想执行一些 Shell 命令或其他外部应用程序,通常都是使用java.lang.Runtime.exec(..)方法来执行的。

当 Java 内置的 Runtime.exec(..) 方法在执行外部命令时,可能存在一些不易察觉的坑,往往会导致程序运行失败。

1.1 Process.exitValue()

IllegalThreadStateException异常:Runtime.exe(..)可能出现IllegalThreadStateException异常。我们通常使用exec(..)方法执行 JVM 外部程序,如果想查看外部程序返回值,可以使用Process.exitValue()方法。

需要注意的是,如果直接使用Process.exitValue()获取外部程序返回值,如果此时外部程序还未运行完成,则会抛出IllegalThreadStateException异常。

举个栗子:比如在 Java 中执行 javac 程序,并获取其返回值。 代码如下:

public class BadExecJavac {
    public static void main(String[] args) throws IOException {
        Process pid = Runtime.getRuntime().exec("javac");
        int exitValue = pid.exitValue();
        System.out.println("Process exitValue: " + exitVal);
    }
}

使用Process.waitFor()替换Process.exitValue()。

1.2 Process.waitFor()

Process.waitFor()与Process.exitValue()同样会返回外部程序的执行结果,但是它会阻塞直到外部程序运行结束。

代码如下:

public static void main(String[] args) throws IOException, InterruptedException {
    Process pid = Runtime.getRuntime().exec("javac");
    int exitValue = pid.waitFor();
    System.out.println("Process exitValue: " + exitValue);
}

注:Process.exitValue()/Process.waitFor()获取外部程序的返回值为 0 表示执行成功,其余值表示外部程序执行出错。

综上:要解决IllegalThreadStateException异常,

  • 要么就是手动捕获Process.exitValue()抛出的异常,
  • 要么就使用Process.waitFor()(推荐)等待外部程序正常运行结束。
Copyright © qgao 2021-* all right reserved,powered by Gitbook该文件修订时间: 2022-08-15 18:16:57

results matching ""

    No results matching ""