主進程調用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();