`

java.lang.Process 阻塞问题

    博客分类:
  • java
阅读更多

Process 类型对象的 waitFor() 方法的时候当前线程会被阻塞掉,因为InputStream in = Process.getInputStream();或 InputStream err = Process.getErrorStream(); 这2个流中的一个会被阻塞住,所以解决的办法可以是用多线程来解决,可以参看http://www.javaworld.com/javaworld/jw-12-2000/jw-1229-traps_p.html

但还有另一种方法可以尝试,

            String[] cmds = {...};//command and arg
            ProcessBuilder builder = new ProcessBuilder(cmds);
            //both read inputstream and errstream
            builder.redirectErrorStream(true);
            Process process = builder.start();
            BufferedReader br = new BufferedReader(new InputStreamReader(process
                .getInputStream()));
            String readLine = br.readLine();
            while (readLine != null) {
               System.out.println(readLine);
               readLine = br.readLine();
            }
            int resultValue = process.waitFor();



builder.redirectErrorStream(true); 和BufferedReader br = new BufferedReader(new InputStreamReader(process.getInputStream())); 这样使用就可以在一个线程中执行,而保证不被阻塞住。

 

分享到:
评论

相关推荐

    JAVA Process 使用

    创建和管理`Process`的主要类是`java.lang.ProcessBuilder`。它提供了构造进程命令行、设置工作目录、环境变量等方法,并最终用于启动新进程。 ```java ProcessBuilder pb = new ProcessBuilder("command", "arg1",...

    JAVA-DOS-command.rar_DOS java_dos command_java dos_shelf

    执行命令后返回一个`java.lang.Process`对象,通过该对象可以获取命令执行的输出、错误流以及控制进程的生命周期(如终止进程)。 2. **调用DOS命令**: 调用DOS命令通常涉及到以下步骤: - **创建Runtime对象**...

    OS.rar_java cpu scheduling_进程 内存 java

    在Java中,进程的创建和管理通常涉及`java.lang.ProcessBuilder`和`java.lang.Process`类。通过这些类,可以启动新的操作系统进程,传递参数,读取进程的输出,甚至控制其生命周期。 总的来说,这个实验将让你在...

    进程交互案例

    在Java中,`java.lang.ProcessBuilder`类和`java.lang.Process`接口是进行进程交互的核心工具。`ProcessBuilder`用于创建新的操作系统进程,并允许设置命令行参数、工作目录和环境变量。一旦启动,它将返回一个`...

    基于Java的进程通信.zip

    在Java编程语言中,进程通信(Process Communication)是多进程应用程序之间交换信息的方式。Java提供了多种机制来实现进程间的通信,这些机制可以帮助开发者构建复杂的分布式系统。本资料包"基于Java的进程通信.zip...

    Java调用外部程序命令

    在Java中,调用外部程序主要涉及到三个类:`java.lang.Runtime`、`java.lang.Process` 和 `java.lang.ProcessBuilder`。下面分别介绍这些类的基本用法。 ##### 1. Runtime 类 `Runtime` 类提供了与当前Java应用...

    java制作超简单动画

    关于进程的使用,Java中的进程(Process)代表操作系统中的一个独立执行单元。在创建动画时,进程并不常用,因为动画通常是在主线程(事件分发线程)中处理的。然而,如果涉及到更复杂的场景,比如在动画执行的同时...

    java 调用doc命令

    在Java中,我们可以借助`java.lang.ProcessBuilder`类或者`java.lang.Runtime.exec()`方法来执行这样的系统命令。 1. **使用ProcessBuilder** `ProcessBuilder`类允许我们构建一个命令数组,然后执行这个命令。...

    模拟进程管理(最终强化版.java0

    在实际项目中,这样的模拟可能还会涉及多线程编程,使用`java.lang.Thread`类或`java.util.concurrent`包下的`ExecutorService`来模拟并发执行。此外,为了测试和验证模拟的正确性,可能会包含一系列单元测试和性能...

    JAVA如何调用WINDOWS命令行.doc

    Java提供了`java.lang.Runtime`类和`java.lang.Process`类来帮助开发者在Java程序中执行外部命令。最常用的方法是`Runtime.getRuntime().exec(command)`,该方法用于创建一个新的子进程来执行指定的命令,并返回一个...

    JAVA如何调用DOS命令.doc

    在Java中,主要通过`java.lang.Runtime`类和`java.lang.Process`类来实现调用DOS命令的功能。具体步骤如下: 1. **创建Runtime实例**:使用`Runtime.getRuntime()`方法获取当前JVM的`Runtime`对象。 2. **执行命令*...

    编程语言java批处理.pdf

    首先,文档中提到了`Runtime`类,它位于`java.lang`包下,是Java程序中进行系统级别的操作时最常用的类之一。`Runtime`类允许Java程序与运行环境交互,比如执行系统命令、获取系统资源使用情况、内存管理等。特别地...

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

    为了解决这个问题,我们可以使用一个额外的线程来不断地从输入流中读取数据,这样就可以确保数据能够及时被处理,而不会堵塞缓冲区。 ##### 4.1 使用清理线程处理大数据量输出 下面是一个改进后的示例,它使用了一...

    java_bat.rar_DEMO

    这两个方法都是Java.lang.Runtime类的一部分,用于与操作系统进行交互。 2. **使用`Runtime.getRuntime().exec()`方法** - 这个方法接收字符串参数,该参数是需要执行的命令。例如,如果你有一个名为`mybatch.bat`...

    java中调用本地exe文件

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

    Java 执行本地脚本携带多参数

    首先,Java提供了一个内置的`java.lang.Runtime`类,它可以让我们与运行Java虚拟机的同一操作系统进行交互,包括执行系统命令。我们可以使用`Runtime.getRuntime().exec()`方法来执行外部命令或脚本。例如,如果你有...

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

    `java.lang.Runtime`类提供了运行时环境的信息和操作,包括执行外部进程的能力。`Runtime.getRuntime()`方法用于获取当前Java应用程序的运行时对象,通过这个对象可以调用`exec()`方法来启动一个新的进程。 #### ...

    JAVA 管道 EXEC

    Java管道(Pipes)和EXEC在Java编程中是用于进程间通信(IPC,Inter-Process Communication)的重要工具。它们允许程序之间共享数据流,尤其是在处理系统命令和子进程时非常有用。下面我们将深入探讨这两个概念及其...

    java_dos_shell_bat

    此外,Java 1.5以后引入的`java.lang.Process`接口提供了更多与子进程交互的方法,如获取进程ID、关闭输入/输出流、等待进程结束等。这些功能使得Java程序可以更好地控制和监控外部命令的执行。 总结来说,Java通过...

    操作系统对进程状态的转换

    Java语言虽然不直接提供操作系统级别的进程管理API,但Java的`java.lang.ProcessBuilder`和`java.lang.Process`类允许开发人员在Java程序中创建和控制操作系统进程。例如,可以使用`ProcessBuilder.start()`方法创建...

Global site tag (gtag.js) - Google Analytics