[英]Java program hangs when running a batch file
我使用下面的代碼從輸入數據生成報告。 當只有很少的數據時,下面的代碼工作正常。 但是當數據量變大時,我的程序就會掛起,必須使用任務管理器來終止進程以關閉應用程序。
public void launchReport() {
if( selectionRulesRespected ) {
final Process p;
final String userNameParLine = getUserNameParLine();
final String injParLine = getFilterByFieldParLine();
writeTmpParFile(tmpParFilePath, new String[]{userNameParLine, injParLine});
try {
final ProcessBuilder builder;
if( exporting != null && "TRUE".equals(exporting.toUpperCase()) ) {
builder = new ProcessBuilder("cmd", "/c", batFilePath, reportName, tmpParFilePath, exportFilePath);
}
else {
builder = new ProcessBuilder("cmd", "/c", batFilePath, reportName, tmpParFilePath);
}
//builder.directory( new File(viewerDirPath));
p = builder.start();
p.waitFor();
} catch (final IOException e) {
PlanonMessageDialog.showErrorDialog(ioError);
} catch (final InterruptedException e) {
e.printStackTrace();
}
} else {
PlanonMessageDialog.showErrorDialog(wrongItem);
}
}
應用程序掛起,因為此方法等待進程完成。 我可以使用哪些選項?
您的 Java 代碼使用 p.waitFor() 等待進程終止。 但是進程寫入 stdout/stderr,緩沖區已滿,因此 Windows 阻止它進一步執行 - 相反,它等待緩沖區被清空。 兩個進程互相等待——這是一個典型的死鎖。
為防止出現這種情況,請將 p.waitFor() 替換為檢查進程是否已退出的循環。 如果不是,則從 stdout 和 stderr 讀取。
另請參見https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/lang/Process.html
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.