[英]In java determine if a process created using Runtime environment has finished execution?
Runtime.getRuntime.exex("abc.exe -parameters");
使用.waitFor()
無助於確定進程的完成。
看起來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;
}
或者,類似的方法可以在進程終止時返回退出值,如果沒有則返回其他指定值。
Process.waitFor()
( javadoc ) 應該可以工作。 如果它不起作用那么:
JVM或操作系統中存在一個錯誤(這種情況不太可能發生),或者
進程和/或Java代碼有一些東西意味着進程不會退出。
在當前版本的Java中,您還可以使用Process.isAlive
( javadoc )來測試進程狀態,而不會阻塞,直到完成為止。 對於Java 7及更早版本,有一個hacky解決方案需要輪詢進程返回代碼並捕獲異常,但這是低效的。 您應該盡快升級到Java 8或更高版本!
一旦任務完成,它就會無限期地等待。 (我不知道為什么)。
如果發生這種情況,那么waitFor()
或isAlive()
都不會有幫助。
從Java啟動的進程不會/不能退出的最可能原因是:
阻止進程等待你的Java應用程序給它一些輸入(通過它的stdin),
阻止進程等待Java應用程序讀取其輸出(即stdout或stderr),
在一些外部事件中被阻止等待; 例如,如果它試圖說話沒有響應的遠程服務器,
有些東西給它發出了某種停止信號,或者
這只是一個漫長的時間來運行。
這兩個原因/原因中的前兩個可以通過(分別)關閉連接到其標准輸入的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表示正常終止。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.