使用java.lang.Process類的簡單例子

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功能》操作系統

相關文章
相關標籤/搜索