RunTime.getRuntime().exec()運行腳本命令介紹和阻塞

 java在企業級項目開發中,不管是強制性的功能須要,仍是爲了簡便java的實現,須要調用服務器命令腳原本執行。在java中,RunTime.getRuntime().exec()就實現了這個功能。

    用法:         public Process exec(String command)-----在單獨的進程中執行指定的字符串命令。
 
       public Process exec(String [] cmdArray)---在單獨的進程中執行指定命令和變量
 
                       public Process exec(String command, String [] envp)----在指定環境的獨立進程中執行指定命令和變量
 
                       public Process exec(String [] cmdArray, String [] envp)----在指定環境的獨立進程中執行指定的命令和變量
 
                       public Process exec(String command,String[] envp,File dir)----在有指定環境和工做目錄的獨立進程中執行指定的字符串命令
 
                       public Process exec(String[] cmdarray,String[] envp,File dir)----在指定環境和工做目錄的獨立進程中執行指定的命令和變量
 
 
舉例:
 
         1.  RunTime.getRuntime().exec(String  command);
 
                         在windows下至關於直接調用   /開始/搜索程序和文件  的指令,好比                              
                         Runtime.getRuntime().exec("notepad.exe");  -------打開windows下記事本。
 
 
        2.  public Process exec(String [] cmdArray);
             Linux下:
             Runtime.getRuntime().exec(new String[]{"/bin/sh","-c", ";
             Windows下:
             Runtime.getRuntime().exec(new String[]{ "cmd", "/c", cmds});
 
 
深刻:  
            Process的幾種方法:
                        1.destroy():殺掉子進程
 
2.exitValue():返回子進程的出口值,值 0 表示正常終止
 
3.getErrorStream():獲取子進程的錯誤流
 
4.getInputStream():獲取子進程的輸入流
 
5.getOutputStream():獲取子進程的輸出流
 
6.waitFor():致使當前線程等待,若有必要,一直要等到由該 Process 對象表示的進程已經終止。若是已終止該子進程,此方法當即返回。若是沒有終止該子進程,調用的線程將被阻塞,直到退出子進程,根據慣例,0 表示正常終止
 
           注意:在java中,調用runtime線程執行腳本是很是消耗資源的,因此切忌不要頻繁使用!
         
                    在調用runtime去執行腳本的時候,其實就是JVM開了一個子線程去調用JVM所在系統的命令,其中開了三個通道: 輸入流、輸出流、錯誤流,其中輸出流就是子線程走調用的通道。
                    你們都知道,waitFor是等待子線程執行命令結束後才執行, 可是在runtime中,打開程序的命令若是不關閉,就不算子線程結束。好比如下代碼。
                          代碼:private static Process p = null;
                                            p = Runtime.getRuntime().exec("notepad.exe");
    p.waitFor();         
System.out.println("--------------------------------------------我被執行了");
                     以上代碼中,打開windows中記事本。若是咱們不手動關閉記事本,那麼輸出語句就不會被執行,這點是須要理解的。  
 
  process的阻塞:
                      在runtime執行大點的命令中,輸入流和錯誤流會不斷有流進入存儲在JVM的緩衝區中,若是緩衝區的流不被讀取被填滿時,就會形成runtime的阻塞。因此在進行好比:大文件複製等的操做時,咱們還須要不斷的去讀取JVM中的緩衝區的流,來防止Runtime的死鎖阻塞。
    
                    代碼:linux中拷貝文件防止阻塞的寫法
                                                RunTime.getRuntime().exec()運行腳本命令介紹和阻塞

RunTime.getRuntime().exec()運行腳本命令介紹和阻塞
相關文章
相關標籤/搜索