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表示正常终止。