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