簡體   English   中英

等待進程完成

[英]Wait for process to finish

我正在嘗試使用此批處理文件轉換某些內容。 批處理文件由 java 調用。 問題是轉換需要一段時間,程序只是向前跳過,導致找不到文件錯誤。 我目前使用 thread.sleep 在 java 端建立了延遲以使其工作(非常丑陋)。 進程 state 立即為 0,因此 process.waitFor() 不適合我。 我需要一些方法來確保批處理文件和 java 都在等待它們的子進程完成。

Java:

Process conversion = runtime.exec("cmd /c start \"\" " 
                                        + scriptDirectory 
                                        + "convert.bat " 
                                        + filepath 
                                        + " " 
                                        + convertedFileName);

System.out.println("Conversion state: " + conversion.waitFor() + "!");

或者:

Process conversion = runtime.exec("cmd /c \\dltViewer\\dlt_viewer.exe -c " 
                                        + filepath 
                                        + " " 
                                        + convertedFileName);

批:

echo off
set back=%cd%
if exist %1 (
    echo %1
    /WAIT %back%\dltViewer\dlt_viewer.exe -c %1 %2
) else (
    echo ERROR: File not found!
    pause
)
exit

無需使用 .bat 文件。 請改用 Java 的waitFor方法:

ProcessBuilder builder = new ProcessBuilder(
    scriptDirectory + "\\dltViewer\\dlt_viewer.exe",
    "-c", filepath, convertedFileName);
builder.inheritIO();

Process conversion = builder.start();

int exitCode = conversion.waitFor();
if (exitCode != 0) {
    throw new IOException("Received exit code " + exitCode
        + " from command " + builder.command());
}

您啟動的過程將永遠持續,因為它可能被阻止。 與其使用 waitFor,不如創建一個循環並使用它從進程的 STDOUT 和 STDERR 流中讀取所有數據。 也不要丟棄這些數據。 而是將其放在日志文件中或系統輸出中,以便您可以查看批處理是否按您的預期執行。

此行為的原因記錄在https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/lang/Process.ZFC35FDC70D5FC69D2639873A822C

默認情況下,創建的進程沒有自己的終端或控制台。 它的所有標准I/O(即stdin、stdout、stderr)操作都將被重定向到父進程,在那里可以通過使用getOutputStream()、getInputStream() 和getErrorStream() 方法獲得的流來訪問它們。 父進程使用這些流向進程提供輸入並從進程中獲取 output。 Because some native platforms only provide limited buffer size for standard input and output streams, failure to promptly write the input stream or read the output stream of the process may cause the process to block, or even deadlock.

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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