`

waitFor()一直等待,线程阻塞问题 ---转载--Java中使用Runtime和Process类运行外部程序

 
阅读更多
使用Runtime.getRuntime().exec()方法可以在java程序里运行外部程序。
  1. exec(String command)
  2. exec(String command, String envp[], File dir)
  3. exec(String cmd, String envp[])
  4. exec(String cmdarray[])
  5. exec(String cmdarray[], String envp[])
  6. exec(String cmdarray[], String envp[], File dir)

一般的应用程序可以直接使用第一版本,当有环境变量传递的时候使用后面的版本。其中2和6版本可以传递一个目录,标识当前目录,因为有些程序是使用相对目录的,所以就要使用这个版本。

cmd.exe /c start <FileName>
使用DOS命令(比如dir)时也要使用到调用。如果想与调用的程序进行交互,那么就要使用该方法的返回对象Process了,通过Process的getInputStream(),getOutputStream()和getErrorStream()方法可以得到输入输出流,然后通过InputStream可以得到程序对控制台的输出信息,通过OutputStream可以给程序输入指令,这样就达到了程序的交换功能。
用Java编写应用时,有时需要在程序中调用另一个现成的可执行程序或系统命令,这时可以通过组合使用Java提供的Runtime类和Process类的方法实现。下面是一种比较典型的程序模式:
1  
2  Process process = Runtime.getRuntime().exec(".\\p.exe");
3  process.waitfor();
4  


在上面的程序中,第一行的“.\\p.exe”是要执行的程序名,Runtime.getRuntime()返回当前应用程序的Runtime对象,该对象的exec()方法指示Java虚拟机创建一个子进程执行指定的可执行程序,并返回与该子进程对应的Process对象实例。通过Process可以控制该子进程的执行或获取该子进程的信息。第二条语句的目的等待子进程完成再往下执行。
但在windows平台上,如果处理不当,有时并不能得到预期的结果。下面是笔者在实际编程中总结的几种需要注意的情况:
  1、执行DOS的内部命令
  如果要执行一条DOS内部命令,有两种方法。一种方法是把命令解释器包含在exec()的参数中。例如,执行dir命令,在NT上,可写成exec("cmd.exe   /c dir"),在windows95/98下,可写成“command.exe /c dir”,其中参数“/c”表示命令执行后关闭DOS立即关闭窗口。另一种方法是,把内部命令放在一个批命令my_dir.bat文件中,在Java程序中写成exec("my_dir.bat")。如果仅仅写成exec("dir"),Java虚拟机则会报运行时错误。前一种方法要保证程序的可移植性,需要在程序中读取运行的操作系统平台,以调用不同的命令解释器。后一种方法则不需要做更多的处理。
  2、打开一个不可执行的文件
  打开一个不可执行的文件,但该文件存在关联的应用程序,则可以有两种方式。以打开一个word文档a.doc文件为例,Java中可以有以下两种写法:
1  exec("start .\\a.doc");
2  exec("Files\\Microsoft Office\\office\\winword.exe .\\a.doc");

  显然,前一种方法更为简捷方便。
  3、执行一个有标准输出的DOS可执行程序
  在Windows平台上,运行被调用程序的DOS窗口在程序执行完毕后往往并不会自动关闭,从而导致Java应用程序阻塞在waitfor()语句。导致该现象的一个可能的原因是,该可执行程序的标准输出比较多,而运行窗口的标准输出缓冲区不够大。解决的办法是,利用Java中Process类提供的方法让Java虚拟机截获被调用程序的DOS运行窗口的标准输出,在waitfor()命令之前读出窗口的标准输出缓冲区中的内容。一段典型的程序如下:
1  
2  String s;
3  Process process = Runtime.getRuntime().exec("cmd /c dir \\windows");
4  BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(process.getInputStream());
5  while((s=bufferedReader.readLine()) != null)
6  System.out.println(s);
7  process.waitfor();
分享到:
评论

相关推荐

    通过JAVA执行命令行程序

    总结,通过Java执行命令行程序主要涉及Runtime.exec()或ProcessBuilder类,而线程阻塞问题可以通过读取进程的输入、输出流来解决。同时,结合文件操作,我们可以实现更复杂的系统级任务,如数据加载和处理。

    java中调用本地exe文件

    在Java中,可以通过`java.lang.Runtime`类或者`java.lang.ProcessBuilder`类来启动外部程序(exe文件)。这两种方式都可以实现同样的功能,但在实际开发过程中,选择哪一种方式取决于具体需求和个人偏好。 - **...

    Runtime 执行bat

    在Java编程语言中,`Runtime`类是每个Java应用程序都有的一个实例,它提供了与运行时环境交互的方法。当我们需要在Java程序中执行系统命令,比如运行一个批处理脚本(.bat文件)时,`Runtime`类或者其扩展类`...

    Java调用Linux命令

    `Runtime`类是所有运行时系统的一个接口,它使得应用程序能够与正在运行的Java虚拟机及其环境中进行交互。每个Java应用程序都有一个`Runtime`实例,通过调用`Runtime.getRuntime()`可以获得当前JVM的`Runtime`对象。...

    java_bat.rar_DEMO

    - 使用`Process.waitFor()`方法可以阻塞当前线程,直到批处理程序执行完毕: ```java int exitCode = p.waitFor(); System.out.println("Batch process exited with code " + exitCode); ``` 6. **批处理文件...

    Java 进程执行外部程序造成阻塞的一种原因

    最后,主线程调用`process.waitFor()`,等待外部程序完成执行。 这段代码的改进之处在于,通过使用单独的线程来处理输出流,确保了Java进程不会因为等待输出流被清空而阻塞。如果忽视了对输出流的处理,那么当输出...

    java执行shell指令

    这就涉及到了Java的`Runtime`类和`ProcessBuilder`类,它们提供了执行外部程序的能力。本文将深入探讨如何在Java中执行shell指令。 ### 1. 使用Runtime类 `Runtime`类是每个Java应用程序都有的一个单例对象,它...

    Java代码中调用shell脚本和python脚本并获得输出结果(分为小数据量和大数据量).docx

    然后,使用`Runtime.getRuntime().exec(command)`执行该命令,并通过`process.waitFor()`等待进程结束。最后,从`process.getInputStream()`读取输出结果,并将其存储在一个字符串列表中。 #### 三、处理小数据量的...

    Java调用相应cmd命令的实例

    首先,Java提供了`Runtime`类和`ProcessBuilder`类来执行外部进程,包括CMD命令。`Runtime.getRuntime().exec()`方法是较早的方式,而`ProcessBuilder`类在Java 5以后引入,提供了更灵活的命令执行方式。 1. 使用`...

    java代码中调用linux/unix命令

    调用`Process.waitFor()`方法可以阻塞当前线程,直到命令执行完成。别忘了关闭输入输出流,防止内存泄漏。 5. **异常处理和错误检查** 通过`Process.exitValue()`检查命令执行是否成功。正常退出时,返回值为0;...

    Java调用Windows批处理.docx

    可以使用`Process`对象的`waitFor()`方法来实现这一点,它会阻塞当前线程,直到子进程终止。 6. **关闭流资源**:在完成批处理文件的输出读取后,别忘了关闭`BufferedReader`和`InputStreamReader`,以释放系统资源...

    java执行外表命令

    使用`Process`对象的`waitFor()`方法可以阻塞直到命令执行完成。这个方法会返回一个整数值,代表命令的退出状态码,0通常表示成功。 5. **异常处理**: 执行外部命令时可能会遇到权限问题、找不到命令等问题,...

    java调用shell

    - **等待脚本完成**:使用`process.waitFor()`确保Shell脚本完全执行完毕再继续后续操作。此方法会阻塞当前线程,直到子进程结束。 - **环境变量**:如果需要为Shell脚本提供特定的环境变量,可以使用`...

    ProcessRunner.zip

    `waitFor()`方法是`Process`类的一个成员,它阻塞当前线程,直到子进程终止,然后返回子进程的退出码。在大多数操作系统中,0表示正常退出,非零值(如1)通常表示异常或错误。这个返回值是由子进程决定的,而不是...

    java代码-Java启动命令行程序并进行输入输出

    这涉及到使用Java的`Runtime`类或者`ProcessBuilder`类来执行外部命令,并通过`InputStream`和`OutputStream`来处理程序的输入和输出。下面我们将详细探讨这两个类以及如何在Java中实现命令行交互。 1. `Runtime....

    在android 中调用ping命令 来获取网络通断

    2. **Runtime.exec()**:是Java中的一个方法,允许应用程序执行外部进程。这对于执行系统级别的命令非常有用,例如在Android中运行`ping`命令。 #### 实现步骤 ##### 步骤一:理解`ping`命令格式 在本示例代码中...

    IUT-Orsay-TP351-groupe-1

    - **等待进程结束**:使用`waitFor()`方法阻塞当前线程,直到子进程结束。 - **获取进程信息**:`exitValue()`返回进程的退出码,表示进程运行结果。 - **管理I/O流**:通过`getInputStream()`、`getErrorStream()`...

Global site tag (gtag.js) - Google Analytics