前言:Java
的類庫日益龐大,所包含的類和接口也不計其數。但其中有一些非常重要的類和接口,是Java類庫中的核心部分。常見的有String、Object、
Class、Collection、ClassLoader、Runtime、Process...,熟悉這些類是學好Java的基礎。而這些類一般不容
易理解,需要做深入的研究和實踐才能掌握。下面是我對這些類理解和使用的一些總結。歡迎你在閱讀后將你寶貴的意見和讀后感留下!
一、概述
Process類是一個抽象類(所有的方法均是抽象的),封裝了一個進程(即一個執行程序)。
Process 類提供了執行從進程輸入、執行輸出到進程、等待進程完成、檢查進程的退出狀態以及銷毀(殺掉)進程的方法。
ProcessBuilder.start() 和 Runtime.exec 方法創建一個本機進程,并返回 Process 子類的一個實例,該實例可用來控制進程并獲取相關信息。
創建進程的方法可能無法針對某些本機平臺上的特定進程很好地工作,比如,本機窗口進程,守護進程,Microsoft Windows 上的
Win16/DOS 進程,或者 shell 腳本。創建的子進程沒有自己的終端或控制臺。它的所有標準 io(即
stdin,stdout,stderr)操作都將通過三個流
(getOutputStream(),getInputStream(),getErrorStream())
重定向到父進程。父進程使用這些流來提供到子進程的輸入和獲得從子進程的輸出。因為有些本機平臺僅針對標準輸入和輸出流提供有限的緩沖區大小,如果讀寫子
進程的輸出流或輸入流迅速出現失敗,則可能導致子進程阻塞,甚至產生死鎖。
當沒有 Process 對象的更多引用時,不是刪掉子進程,而是繼續異步執行子進程。
二、API預覽
destroy()
殺掉子進程。
exitValue()
返回子進程的出口值。
InputStream getErrorStream()
獲得子進程的錯誤流。
InputStream getInputStream()
獲得子進程的輸入流。
OutputStream getOutputStream()
獲得子進程的輸出流。
waitFor()
導致當前線程等待,如果必要,一直要等到由該 Process 對象表示的進程已經終止。
三、如何創建Process對象,一般有一下兩種方法:
1、每個 ProcessBuilder 實例管理一個進程屬性集。start() 方法利用這些屬性創建一個新的 Process
實例。start()
方法可以從同一實例重復調用,以利用相同的或相關的屬性創建新的子進程。(ProcessBuilder這個是JDK5中新添加的final類,詳細請參
看“深入研究java.lang.ProcessBuilder類”一文。
2、Runtime.exec() 方法創建一個本機進程,并返回 Process 子類的一個實例。詳細請參看“深入研究java.lang.Runtime類”一文。
四、官方API文檔。
java.lang
類 Process
java.lang.Object
java.lang.Process
-
public abstract class Process
- extends Object
ProcessBuilder.start()
和 Runtime.exec
方法創建一個本機進程,并返回 Process
子類的一個實例,該實例可用來控制進程并獲取相關信息。Process
類提供了執行從進程輸入、執行輸出到進程、等待進程完成、檢查進程的退出狀態以及銷毀(殺掉)進程的方法。
創建進程的方法可能無法針對某些本機平臺上的特定進程很好地工作,比如,本機窗口進程,守護進程,Microsoft Windows
上的 Win16/DOS 進程,或者 shell 腳本。創建的子進程沒有自己的終端或控制臺。它的所有標準 io(即
stdin,stdout,stderr)操作都將通過三個流 (getOutputStream()
,getInputStream()
,getErrorStream()
) 重定向到父進程。父進程使用這些流來提供到子進程的輸入和獲得從子進程的輸出。因為有些本機平臺僅針對標準輸入和輸出流提供有限的緩沖區大小,如果讀寫子進程的輸出流或輸入流迅速出現失敗,則可能導致子進程阻塞,甚至產生死鎖。
當沒有 Process
對象的更多引用時,不是刪掉子進程,而是繼續異步執行子進程。
對于帶有 Process
對象的 Java 進程,沒有必要異步或并發執行由 Process
對象表示的進程。
- 從以下版本開始:
- JDK1.0
- 另請參見:
ProcessBuilder
, Runtime.exec(String[], String[], File)
從類 java.lang.Object 繼承的方法 |
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait |
Process
public Process()
getOutputStream
public abstract OutputStream getOutputStream()
- 獲得子進程的輸出流。輸出流被傳送給由該
Process
對象表示的進程的標準輸入流。
實現注意事項:對輸出流進行緩沖是一個好主意。
-
- 返回:
- 連接到子進程正常輸入的輸出流。
getInputStream
public abstract InputStream getInputStream()
- 獲得子進程的輸入流。輸入流獲得由該
Process
對象表示的進程的標準輸出流。
實現注意事項:對輸入流進行緩沖是一個好主意。
-
- 返回:
- 連接到子進程正常輸出的輸入流。
- 另請參見:
ProcessBuilder.redirectErrorStream()
getErrorStream
public abstract InputStream getErrorStream()
- 獲得子進程的錯誤流。錯誤流獲得由該
Process
對象表示的進程的錯誤輸出流傳送的數據。
實現注意事項:對輸入流進行緩沖是一個好主意。
-
- 返回:
- 連接到子進程錯誤流的輸入流。
- 另請參見:
ProcessBuilder.redirectErrorStream()
waitFor
public abstract int waitFor()
throws InterruptedException
- 導致當前線程等待,如果必要,一直要等到由該
Process
對象表示的進程已經終止。如果已終止該子進程,此方法立即返回。如果沒有終止該子進程,調用的線程將被阻塞,直到退出子進程。
-
- 返回:
- 進程的出口值。根據慣例,
0
表示正常終止。
- 拋出:
InterruptedException
- 如果當前線程在等待時被另一線程 中斷
,則停止等待,拋出 InterruptedException
。
exitValue
public abstract int exitValue()
- 返回子進程的出口值。
-
- 返回:
- 此
Process
對象表示的子進程的出口值。根據慣例,值 0
表示正常終止。
- 拋出:
IllegalThreadStateException
- 如果此 Process
對象表示的子進程尚未終止。
destroy
public abstract void destroy()
- 殺掉子進程。強制終止此
Process
對象表示的子進程。
posted on 2008-06-04 20:47
lvq810 閱讀(931)
評論(0) 編輯 收藏 所屬分類:
Java