commons-exec:当我调用executor.execute(commandLine)时挂起;

时间:2010-04-24 01:25:37

标签: java multithreading apache-commons-exec

我不知道为什么会挂这个。我试图通过commons-exec捕获进程的输出,然后我继续挂起。我已经提供了一个示例程序来演示以下这种行为。

import java.io.DataInputStream;
import java.io.IOException;
import java.io.PipedInputStream;
import java.io.PipedOutputStream;
import org.apache.commons.exec.CommandLine;
import org.apache.commons.exec.DefaultExecutor;
import org.apache.commons.exec.ExecuteException;
import org.apache.commons.exec.PumpStreamHandler;
public class test {

public static void main(String[] args) {
    String command = "java";

    PipedOutputStream output = new PipedOutputStream();
    PumpStreamHandler psh = new PumpStreamHandler(output);

    CommandLine cl = CommandLine.parse(command);

    DefaultExecutor exec = new DefaultExecutor();
    DataInputStream is = null;
    try {
        is = new DataInputStream(new PipedInputStream(output));
        exec.setStreamHandler(psh);
        exec.execute(cl);
    } catch (ExecuteException ex) {
    } catch (IOException ex) {
    }

    System.out.println("huh?");
}
}

2 个答案:

答案 0 :(得分:9)

根据javadocexecute(CommandLine command)是同步的,另一方面execute(CommandLine command, ExecuteResultHandler handler)是异步的。

答案 1 :(得分:5)

您调用的命令java会将输出生成到其标准输出流。必须通过调用程序将该流抽入输入流。这不会发生在你的程序中。

您必须在单独的线程中读取输入流(代码中的is),因为这就是管道流的工作方式。请注意,您必须在调用execute()之前启动阅读线程。

另见Capturing large amounts of output from Apache Commons-Exec

根据您的其他问题Streaming output with commons-exec?,您期望大数据,因此您必须使用管道流,并且不能使用更简单的方法使用ByteArrayInputStream作为输出。你在那里给自己的答案,遇到的问题与你的代码相同。