在java中,确定使用运行时环境创建的进程是否已完成执行


Runtime.getRuntime.exex("abc.exe -parameters");

使用CCD_ 1无助于确定过程的完成。

看起来JDK8引入了Process.isAlive()。没想到花了这么长时间。。。

与此同时,最好的选择似乎是轮询Process.exitValue(),它包含在一个try-catch中:

// somewhere previous...
String[] cmd = { "abc.exe", "-p1", "-p2" };
Process process = Runtime.getRuntime.exec(cmd);
// call this method repeatedly until it returns true
private boolean processIsTerminated () {
    try {
        process.exitValue();
    } catch (IllegalThreadStateException itse) {
        return false;
    }
    return true;
}

或者,如果进程已终止,则类似的方法可以返回exit值,如果未终止,则返回其他指定值。

Process.waitFor()(javadoc(应该工作。如果它不起作用,那么要么:

  • JVM或操作系统(极不可能出现类似情况(或中存在错误

  • 进程和/或Java代码中有一些内容意味着进程不会退出


在当前版本的Java中,您还可以使用Process.isAlive(javadoc(来测试进程状态,而无需阻塞,直到它完成。对于Java7及更早版本,有一个棘手的解决方案,需要轮询进程返回代码并捕获异常,但这是低效的。您应该尽快升级到Java 8或更高版本


一旦任务完成,它将无限期地等待。(我不知道为什么(。

如果发生这种情况,那么waitFor()isAlive()都不会有帮助。

从Java启动的进程不会/不能退出的最可能原因是:

  • 进程被阻塞,等待Java应用程序(通过其stdin(向它提供一些输入,

  • 进程被阻塞,等待Java应用程序读取其输出(即stdout或stderr(,

  • 它被阻止等待某个外部事件;例如,如果它试图与没有响应的远程服务器通话,

  • 有东西向它发送了某种STOP信号,或者

  • 运行起来只需要一段时间。

这些原因/原因中的前两个可以通过(分别(关闭连接到其标准输入的Java输出流,并读取(并可能丢弃(连接到标准输出和标准错误的Java输入流来解决。其他原因是难以解决的,你唯一的选择是"等待它结束"或试图扼杀这个过程。


最重要的是,你需要找出为什么你的流程没有完成。Process.waitFor()呼叫受阻是一种症状,而不是疾病。

我有一个类似的问题,这里写的两种方法都不适合我。这是我的代码:

public void startCCleaner() {
    System.out.println("Starting ccleaner...");
    try {
        Process process = new ProcessBuilder("C:\Program Files\CCleaner\CCleaner64.exe").start();
        if(process.waitFor() == 0 ){
            System.out.println("Process terminated ");
        }
    } catch (IOException e) {
        e.printStackTrace();
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
}

如果你不想使用waitFor(),显然你不想,你总是可以直接测试出口值。

import java.util.*;
import java.io.*;
public class ProcExitTest
{
    public static void main(String args[])
    {
        try
        {            
            Runtime rt = Runtime.getRuntime();
            Process proc = rt.exec("<....>");
            int exitVal = proc.exitValue();
            System.out.println("Process exitValue: " + exitVal);
        } 
          catch (InterruptedException ie)
          {
            ie.printStackTrace();
          }
    }
}

退出代码0表示正常终止。

最新更新