`
JasonShieh
  • 浏览: 527461 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Runtime.getRuntime().exec执行阻塞问题解决 .

    博客分类:
  • JAVA
 
阅读更多
转自:http://blog.csdn.net/dysj4099/article/details/5985596
当cmd命令执

行出现错误或警告时,主控程序的waitfor方法会被阻塞一直等待下去,查了查资料发现是Runtime.getRuntime().exec方法需要自己处理



stderr 及stdout流,而解决方法即是将它们导出用别的thread处理。



会造成阻塞的代码:



view plaincopy to clipboardprint?
01.Process p = Runtime.getRuntime().exec(cmd); 
02. 
03.p.waitFor(); 
Process p = Runtime.getRuntime().exec(cmd);

p.waitFor();



解决方法:

view plaincopy to clipboardprint?
01.Process p = Runtime.getRuntime().exec(cmd);  
02.  
03.StreamGobbler errorGobbler = new StreamGobbler(p.getErrorStream(), "ERROR");              
04.        
05.      // kick off stderr   
06.      errorGobbler.start();  
07.        
08.      StreamGobbler outGobbler = new StreamGobbler(p.getInputStream(), "STDOUT");  
09.      // kick off stdout   
10.      outGobbler.start();   
11.  
12.p.waitFor();  
			Process p = Runtime.getRuntime().exec(cmd);
			
			StreamGobbler errorGobbler = new StreamGobbler(p.getErrorStream(), "ERROR");            
	        
	        // kick off stderr
	        errorGobbler.start();
	        
	        StreamGobbler outGobbler = new StreamGobbler(p.getInputStream(), "STDOUT");
	        // kick off stdout
	        outGobbler.start(); 
			
			p.waitFor(); 

 


其中StreamGobbler类的代码:


view plaincopy to clipboardprint?
01.package com.sdc.callmaxent.socket;  
02.  
03.import java.io.BufferedReader;  
04.import java.io.IOException;  
05.import java.io.InputStream;  
06.import java.io.InputStreamReader;  
07.import java.io.OutputStream;  
08.import java.io.PrintWriter;  
09.  
10.import com.sdc.callmaxent.util.FileUtil;  
11.  
12./** 
13. * 用于处理Runtime.getRuntime().exec产生的错误流及输出流 
14. * @author shaojing 
15. * 
16. */  
17.public class StreamGobbler extends Thread {  
18.    InputStream is;  
19.    String type;  
20.    OutputStream os;  
21.          
22.    StreamGobbler(InputStream is, String type) {  
23.        this(is, type, null);  
24.    }  
25.  
26.    StreamGobbler(InputStream is, String type, OutputStream redirect) {  
27.        this.is = is;  
28.        this.type = type;  
29.        this.os = redirect;  
30.    }  
31.      
32.    public void run() {  
33.        InputStreamReader isr = null;  
34.        BufferedReader br = null;  
35.        PrintWriter pw = null;  
36.        try {  
37.            if (os != null)  
38.                pw = new PrintWriter(os);  
39.                  
40.            isr = new InputStreamReader(is);  
41.            br = new BufferedReader(isr);  
42.            String line=null;  
43.            while ( (line = br.readLine()) != null) {  
44.                if (pw != null)  
45.                    pw.println(line);  
46.                System.out.println(type + ">" + line);      
47.            }  
48.              
49.            if (pw != null)  
50.                pw.flush();  
51.        } catch (IOException ioe) {  
52.            ioe.printStackTrace();    
53.        } finally{  
54.            FileUtil.close(pw);  
55.            FileUtil.close(br);  
56.            FileUtil.close(isr);  
57.        }  
58.    }  
59.}   
分享到:
评论
2 楼 xblia 2011-09-16  
xblia 写道
   

  
1 楼 xblia 2011-09-16  
   

相关推荐

    Runtime 执行bat

    `Runtime`类提供了多个`exec()`方法来执行命令或命令行。例如,`exec(String command)`用于执行单个命令,而`exec(String[] cmdArray)`则接受命令及其参数的数组。在执行bat脚本时,我们通常使用后者,因为bat文件...

    解决runtime.exec()执行进程block死锁以及为waitFor设置超时

    完美解决runtime.exec()执行进程block死锁以及为waitFor设置超时 不需要耗cpu的循环判断exitValue==0 开两个进程搞定

    java调用windows命令

    - 使用`Runtime.getRuntime().exec()`方法创建一个子进程来执行指定的可执行程序。例如: ```java Process process = Runtime.getRuntime().exec(".\\p.exe"); ``` - `exec()`方法返回一个Process对象,可以...

    java执行可执行文件或批处理

    `Runtime.getRuntime()`方法用于获取当前Java应用程序的运行时对象,通过这个对象可以调用`exec()`方法来启动一个新的进程。 #### exec()方法详解 `exec()`方法是`Runtime`类中的一个重要成员,它用于启动一个新...

    执行exe文件并获取执行结果

    `Runtime.getRuntime().exec()`方法会启动一个新的进程来执行指定的命令。`getInputStream()`和`getErrorStream()`分别用于获取进程的标准输出和错误输出。`waitFor()`方法会阻塞直到进程结束,返回值是进程的退出码...

    JAVA如何调用DOS命令.doc

    2. **执行命令**:调用`Runtime`对象的`exec(String command)`方法来执行指定的命令。 3. **处理输出**:通过`Process`对象提供的方法来获取执行结果或者控制执行过程。 4. **等待命令执行结束**:调用`Process`对象...

    java执行bat命令碰到的阻塞问题的解决方法

    然而,当我们直接使用`Runtime.getRuntime().exec()`方法执行bat命令时,可能会遇到阻塞问题。这个问题通常发生在bat文件执行时间较长,或者bat文件的输出流没有被正确处理时,Java程序会等待bat命令的完成,从而...

    编程语言java批处理.pdf

    特别地,文档中提到了`Runtime.getRuntime().exec(String command)`方法,这是执行系统命令的常用方式。例如: ```java Process process = Runtime.getRuntime().exec("p.exe"); ``` 上述代码执行了名为`p.exe`的...

    JAVA如何调用WINDOWS命令行.doc

    `Runtime.getRuntime()`返回当前应用程序的`Runtime`对象,该对象的`exec()`方法指示Java虚拟机创建一个子进程执行指定的可执行程序,并返回与该子进程对应的`Process`对象实例。`process.waitFor()`则是等待子进程...

    java代码中调用linux/unix命令

    `Runtime.getRuntime().exec(String command)`或`Runtime.getRuntime().exec(String[] cmdArray)`可以执行单个命令。例如,执行`ls`命令可以写成: ```java Process process = Runtime.getRuntime().exec("ls"); ...

    java_dos_shell_bat

    `Runtime.getRuntime().exec()`方法是最常见的执行DOS命令的方式,它能够启动一个新的进程并执行指定的命令。例如,如果你想要列出当前目录下的所有文件,你可以这样写: ```java try { Process process = Runtime...

    通过Java运行一个外部程序

    `Runtime.getRuntime().exec(command)`是关键部分,它调用了`Runtime`类的`exec()`方法来执行指定的命令。如果在执行过程中出现异常,代码会捕获并打印异常信息。 `Runtime.exec()`方法有多个重载版本,用于处理...

    java_bat.rar_DEMO

    - Java使用`Runtime.getRuntime().exec()`方法或者`ProcessBuilder`类来执行系统命令,包括调用批处理文件。这两个方法都是Java.lang.Runtime类的一部分,用于与操作系统进行交互。 2. **使用`Runtime.getRuntime...

    JAVA如何调用DOS命令

    首先,`Runtime.getRuntime().exec()`方法是Java程序与操作系统交互的关键,它接受一个字符串参数,这个字符串是需要执行的命令。在Windows环境下,如果要执行DOS命令,我们需要确保命令是正确的格式。例如,如果要...

    Java调用Linux CenterOS系统安装的OpenOffice4报错

    在Java编程中,有时我们需要与操作系统进行交互,例如在服务器端执行系统命令,这通常通过Java的`Runtime.getRuntime().exec()`或`ProcessBuilder`类来实现。在这个特定的问题"Java调用Linux CentOS系统安装的...

    java批处理[归类].pdf

    例如,`Runtime.getRuntime().exec("p.exe")`将会创建一个子进程来执行名为`p.exe`的程序。 2. `Process`类:`exec()`方法返回的是一个`Process`对象,代表了被创建的子进程。`Process`类提供了若干方法来获取子...

    ProcessBuilder非阻塞是调用

    这里使用了 Runtime.getRuntime().exec() 方法来执行外部命令,并将其输出流和错误流传递给 StreamDrainer 类来处理。 ProcessBuilder 非阻塞是调用是指在 Java 中使用 ProcessBuilder 类来执行外部命令或程序时,...

    Java调用linux shell脚本的方法

    在Java中,我们可以通过`Runtime.getRuntime().exec()`方法来执行shell命令。例如,以下代码会赋予名为`test.sh`的脚本所有用户的执行权限: ```java String cmdstring = "chmod a+x test.sh"; Process proc = ...

Global site tag (gtag.js) - Google Analytics