posts - 15,  comments - 8,  trackbacks - 0

          前言: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)程。

           

          posted on 2008-06-04 20:47 lvq810 閱讀(935) 評(píng)論(0)  編輯  收藏 所屬分類: Java
          主站蜘蛛池模板: 和平县| 来宾市| 大厂| 绿春县| 长海县| 星座| 屏东县| 都安| 宜川县| 分宜县| 西贡区| 湖口县| 大田县| 夏河县| 如皋市| 团风县| 平凉市| 昌平区| 长泰县| 郸城县| 谢通门县| 双鸭山市| 海丰县| 开封县| 邵东县| 宁明县| 团风县| 出国| 元谋县| 新邵县| 黔东| 临夏市| 菏泽市| 社会| 五指山市| 思茅市| 灵石县| 卢氏县| 泸西县| 罗甸县| 万荣县|