簡體   English   中英

運行批處理文件時 Java 程序掛起

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

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