簡體   English   中英

在java中確定使用Runtime環境創建的進程是否已完成執行?

[英]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.isAlivejavadoc )來測試進程狀態,而不會阻塞,直到完成為止。 對於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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM