ProcessBuilder類是J2SE 1.5在java.lang中新添加的一個新類,此類用於建立操做系統進程,它提供一種啓動和管理進程(也就是應用程序)的方法。在J2SE 1.5以前,都是由Process類處來實現進程的控制管理。本文簡單介紹一下Process類的用法以及一些須要注意的問題。java
API方法說明以下:
- destroy() 殺掉子進程。
- exitValue() 返回子進程的出口值。該方法不阻塞,若是此 Process 對象表示的子進程還沒有終止,就會拋出IllegalThreadStateException異常,停止進程
- getErrorStream() 獲取子進程的錯誤流
- getInputStream() 獲取子進程的輸入流
- getOutputStream() 獲取子進程的輸出流,基本上不會用到輸出流
- waitFor() 致使當前線程等待,若有必要,一直要等到由該 Process 對象表示的進程已經終止。致使當前線程等待,若有必要,一直要等到由該 Process對象表示的進程已經終止。若是已終止該子進程,此方法當即返回。若是沒有終止該子進程,調用的線程將被阻塞,直到退出子進程segmentfault
一個簡單的例子:工具
/** * 列出全部的進程信息 */ public class ListAllProcessTest { public static void main(String[] args) { BufferedReader br = null; Process process = null; try { process = Runtime.getRuntime().exec("tasklist"); br = new BufferedReader(new InputStreamReader(process.getInputStream(), "GBK")); String line = null; System.out.println("列出全部正在運行的進程信息:"); while ((line = br.readLine()) != null) { System.out.println(line); } } catch (IOException e) { e.printStackTrace(); } finally { if (br != null) { try { br.close(); } catch (Exception e) { e.printStackTrace(); } } if(process!=null){ process.destroy(); } } } }
程序輸出以下:
ui
直接在WIN7的命令行執行命令:tasklist,輸出結果以下:
spa
注意問題:
由於有些本機平臺僅針對標準輸入和輸出流提供有限的緩衝區大小,若是讀寫子進程的輸出流或輸入流迅速出現失敗,則可能致使子進程阻塞,甚至產生死鎖。爲了防止進程無限阻塞或者死鎖,使用Process類時,須要加上超時控制,詳細內容能夠看博文《Process工具類,提供設置timeout功能》。操作系統