[乐意黎原创] Process process=Runtime.getRuntime().exec();里面产生停滞(阻塞,blocking),怎么处理?

Process  process=Runtime.getRuntime().exec("");中产生停滞(阻塞,blocking),怎么解决?  
---------------------------------------------------------------  
 
这个是因为Runtime.getRuntime().exec()要自己去处理stdout和stderr的。  
所以如果你想让程序正常运行的话,请务必将上述用别的线程流取走。  
 
>test.bat  
haha  
exit  99  
 
>RuntimeTest.java  
public  class  RuntimeTest  {  
 
           public  static  void  main(String[]  args)  {  
                       try  {  
                                   Process  process=Runtime.getRuntime().exec("test.bat");  
                                   StreamGobbler  errorGobbler  =  new  StreamGobbler(process.getErrorStream(),  "ERROR");                          
                 
                           //  kick  off  stderr  
                           errorGobbler.start();  
                             
                           StreamGobbler  outGobbler  =  new  StreamGobbler(process.getInputStream(),  "STDOUT");  
                           //  kick  off  stdout  
                           outGobbler.start();  
                             
                                   process.waitFor();  
                                   System.out.println(process.exitValue());  
                       }  catch(Exception  e)  {}              
           }  
}  
 
 
>StreamGobbler.java  
import  java.io.BufferedReader;  
import  java.io.IOException;  
import  java.io.InputStream;  
import  java.io.InputStreamReader;  
import  java.io.OutputStream;  
import  java.io.PrintWriter;  
 
public  class  StreamGobbler  extends  Thread  {  
           InputStream  is;  
           String  type;  
           OutputStream  os;  
         
           StreamGobbler(InputStream  is,  String  type)  {  
                       this(is,  type,  null);  
           }  
 
       StreamGobbler(InputStream  is,  String  type,  OutputStream  redirect)  {  
               this.is  =  is;  
               this.type  =  type;  
               this.os  =  redirect;  
       }  
         
       public  void  run()  {  
               try  {  
                       PrintWriter  pw  =  null;  
                       if  (os  !=  null)  
                               pw  =  new  PrintWriter(os);  
                                 
                       InputStreamReader  isr  =  new  InputStreamReader(is);  
                       BufferedReader  br  =  new  BufferedReader(isr);  
                       String  line=null;  
                       while  (  (line  =  br.readLine())  !=  null)  {  
                               if  (pw  !=  null)  
                                       pw.println(line);  
                               System.out.println(type  +  ">"  +  line);          
                       }  
                       if  (pw  !=  null)  
                               pw.flush();  
               }  catch  (IOException  ioe)  {  
                       ioe.printStackTrace();      
               }  
       }  
}

©️2020 CSDN 皮肤主题: 编程工作室 设计师:CSDN官方博客 返回首页