Java建立進程__Java
來源:互聯網
上載者:User
Java建立進程
1 進程的概念 1
1.1 進程的概念 1
1.2 進程的特徵 1
1.3 進程與線程區別 1
2 進程的建立 1
2.1 JAVA進程的建立 1
2.1.1 ProcessBuilder 2
2.1.2 Runtime 3
2.1.3 Process 4
2.2 執行個體 5
2.2.1 建立子進程 5
2.2.2 進程阻塞問題 7
2.2.3 在java中執行java程式 11
1 進程的概念
1.1 進程的概念
進程是作業系統結構的基礎;是一個正在執行的程式;電腦中正在啟動並執行程式執行個體;可以分配給處理器並由處理器執行的一個實體;由單一順序的執行顯示,一個目前狀態和一組相關的系統資源所描述的活動單元。
第一,進程是一個實體。每一個進程都有它自己的地址空間,一般情況下,包括文本地區(text region)、資料區域(data region)和堆棧(stack region)。文本地區儲存處理器執行的代碼;資料區域儲存變數和進程執行期間使用的動態分配的記憶體;堆棧地區儲存著活動程序呼叫的指令和本地變數。
第 二,進程是一個“執行中的程式”。程式是一個沒有生命的實體,只有處理器賦予程式生命時,它才能成為一個活動的實體,我們稱其為進程。
1.2 進程的特徵
動態性:進程的實質是程式在多道程式系統中的一次執行過程,進程是動態產生,動態消亡的。
並發性:任何進程都可以同其他進程一起並發執行
獨立性:進程是一個能獨立啟動並執行基本單位,同時也是系統分配資源和調度的獨立單位;
非同步性:由於進程間的相互制約,使進程具有執行的間斷性,即進程按各自獨立的、不可預知的速度向前推進
結構特徵:進程由程式、資料和進程式控制制塊三部分組成。
多個不同的進程可以包含相同的程式:一個程式在不同的資料集裡就構成不同的進程,能得到不同的結果;但是執行過程中,程式不能發生改變。
1.3 進程與線程區別
進程和線程的主要差別在於它們是不同的作業系統資源管理方式。進程有獨立的地址空間,一個進程崩潰後,在保護模式下不會對其它進程產生影 響,而線程只是一個進程中的不同執行路徑。線程有自己的堆棧和局部變數,但線程之間沒有單獨的地址空間,一個線程死掉就等於整個進程死掉,所以多進程的程 序要比多線程的程式健壯,但在進程切換時,耗費資源較大,效率要差一些。但對於一些要求同時進行並且又要共用某些變數的並行作業,只能用線程,不能用進 程。
2 進程的建立
2.1 Java進程的建立
Java提供了兩種方法用來啟動進程或其它程式:
(1)使用Runtime的exec()方法
(2)使用ProcessBuilder的start()方法
2.1.1 ProcessBuilder
ProcessBuilder類是J2SE 1.5在java.lang中新添加的一個新類,此類用於建立作業系統進程,它提供一種啟動和管理進程(也就是應用程式)的方法。在J2SE 1.5之前,都是由Process類處來實現進程的控制管理。
每個 ProcessBuilder 執行個體管理一個進程屬性集。start() 方法利用這些屬性建立一個新的 Process 執行個體。start() 方法可以從同一執行個體重複調用,以利用相同的或相關的屬性建立新的子進程。
每個進程產生器管理這些進程屬性:
命令 是一個字串列表,它表示要調用的外部程式檔案及其參數(如果有)。在此,表示有效作業系統命令的字串列表是依賴於系統的。例如,每一個總體變數,通常都要成為此列表中的元素,但有一些作業系統,希望程式能自已標幟命令列字串——在這種系統中,Java 實現可能需要命令確切地包含這兩個元素。
環境 是從變數 到值 的依賴於系統的映射。初始值是當前進程環境的一個副本(請參閱 System.getenv())。
工作目錄。預設值是當前進程的當前工作目錄,通常根據系統屬性 user.dir 來命名。
redirectErrorStream 屬性。最初,此屬性為 false,意思是子進程的標準輸出和錯誤輸出被發送給兩個獨立的流,這些流可以通過 Process.getInputStream() 和 Process.getErrorStream() 方法來訪問。如果將值設定為 true,標準錯誤將與標準輸出合并。這使得關聯錯誤訊息和相應的輸出變得更容易。在此情況下,合并的資料可從 Process.getInputStream() 返回的流讀取,而從 Process.getErrorStream() 返回的流讀取將直接到達檔案尾。
修改進程構建器的屬性將影響後續由該對象的 start() 方法啟動的進程,但從不會影響以前啟動的進程或 Java 自身的進程。大多數錯誤檢查由 start() 方法執行。可以修改對象的狀態,但這樣 start() 將會失敗。例如,將命令屬性設定為一個空列表將不會拋出異常,除非包含了 start()。
注意,此類不是同步的。如果多個線程同時訪問一個 ProcessBuilder,而其中至少一個線程從結構上修改了其中一個屬性,它必須 保持外部同步。
Java代碼 構造方法摘要 ProcessBuilder(List<String> command) 利用指定的作業系統程式和參數構造一個進程產生器。 ProcessBuilder(String... command) 利用指定的作業系統程式和參數構造一個進程產生器。 方法摘要 List<String> command() 返回此進程產生器的作業系統程式和參數。 ProcessBuilder command(List<String> command) 設定此進程產生器的作業系統程式和參數。 ProcessBuilder command(String... command) 設定此進程產生器的作業系統程式和參數。 File directory() 返回此進程產生器的工作目錄。 ProcessBuilder directory(File directory) 設定此進程產生器的工作目錄。 Map<String,String> environment() 返回此進程產生器環境的字串映射視圖。 boolean redirectErrorStream() 通知進程產生器是否合并標準錯誤和標準輸出。 ProcessBuilder redirectErrorStream(boolean redirectErrorStream) 設定此進程產生器的 redirectErrorStream 屬性。 Process start() 使用此進程產生器的屬性啟動一個新進程。
2.1.2 Runtime
每個 Java 應用程式都有一個 Runtime 類執行個體,使應用程式能夠與其啟動並執行環境相串連。可以通過 getRuntime 方法擷取當前運行時。
應用程式不能建立自己的 Runtime 類執行個體。但可以通過 getRuntime 方法擷取當前Runtime運行時對象的引用。一旦得到了一個當前的Runtime對象的引用,就可以調用Runtime對象的方法去控制Java虛擬機器的狀態和行為。
Java代碼 void addShutdownHook(Thread hook) 註冊新的虛擬機器來關閉掛鈎。 int availableProcessors() 向 Java 虛擬機器返回可用處理器的數目。 Process exec(String command) 在單獨的進程中執行指定的字串命令。 Process exec(String[] cmdarray) 在單獨的進程中執行指定命令和變數。 Process exec(String[] cmdarray, String[] envp) 在指定環境的獨立進程中執行指定命令和變數。 Process exec(String[] cmdarray, String[] envp, File dir) 在指定環境和工作目錄的獨立進程中執行指定的命令和變數。 Process exec(String command, String[] envp) 在指定環境的單獨進程中執行指定的字串命令。 Process exec(String command, String[] envp, File dir) 在有指定環境和工作目錄的獨立進程中執行指定的字串命令。 void exit(int status) 通過啟動虛擬機器的關閉序列,終止當前正在啟動並執行 Java 虛擬機器。 long freeMemory() 返回 Java 虛擬機器中的空閑記憶體量。 void gc() 運行記憶體回收行程。 InputStream getLocalizedInputStream(InputStream in)