[英]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.