解決JAVA Process死鎖


主進程調用Process.waitfor后已掛起。當前子進程和主進程之間的緩沖區塞滿后,子進程不能繼續寫數據,然后也會掛起。

需要獲取Process.getInputStream和Process.getErrorStream並處理。

    // 處理子進程輸出的線程,防止死鎖
    static class StreamHandler extends Thread {

        private InputStream in;

        public StreamHandler(InputStream in) {
            this.in = in;
        }

        public void run() {
            try {
                BufferedReader reader = new BufferedReader(
                        new InputStreamReader(in));
                String line = null;
                while ((line = reader.readLine()) != null) {
                    System.out.println(line);
                }
            } catch (Exception e) {
                System.out.println(e.getMessage());
            }
        }
    }

           ProcessBuilder pb = new ProcessBuilder();
            // 添加命令
            pb.command(cmd);
            // 重定向錯誤輸出,將錯誤輸出合並到inputStream
            pb.redirectErrorStream(true);
            // 啟動子進程
            Process p = pb.start();
            // 啟動協助進程的子線程,將Process的inputStream輸出,防止死鎖
            new StreamHandler(p.getInputStream()).start();
            // 開始執行
            int w = p.waitFor();
            p.destroy();                    

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM