Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用线程捕获进程输出_Java_Multithreading - Fatal编程技术网

Java 使用线程捕获进程输出

Java 使用线程捕获进程输出,java,multithreading,Java,Multithreading,我正在使用一个线程捕获进程的流输出,然后将该流输出到eclipse控制台。我的问题是何时终止执行流输出的线程 Thread t = new Thread(new Runnable(){ private boolean isProcessDone(Process p) { //not sure what to do here } public void run() { P

我正在使用一个线程捕获进程的流输出,然后将该流输出到eclipse控制台。我的问题是何时终止执行流输出的线程

Thread t = new Thread(new Runnable(){
        private boolean isProcessDone(Process p)
        {
            //not sure what to do here
        }
        public void run()
        {
            Process p = Runtime.getRuntime().exec("executable with output");
            BufferedReader input = new BufferedReader(new InputStreamReader(p.getInputStream()));
            BufferedReader error = new BufferedReader (new InputStreamReader(p.getErrorStream()));
            while ( !isProcessDone(p) ) {
                String line;
                if( (line = input.readLine()) != null )
                {
                    System.out.println(line);
                }
                if( (line = error.readLine()) != null )
                {
                    System.out.println(line);
                }
            }
            input.close();  
            error.close();      
        }
    });
    t.start();
我的问题是什么属于
isProcessDone()
函数。我所基于的示例使用了流的
ready()
函数,但我不清楚这是否适用于std::err和std::out,但两者都不适用的程序。我也试过使用

try{
    p.exitValue();
    return true;
}catch(IllegalThreadStateException e){}
return false;

但是,在while循环有机会对流执行操作之前,线程就完成了,并且输出丢失。

您需要有两个线程。一个用来处理I/O,另一个用来等待进程完成(process.waitFor()),并设置一个标志,告诉I/O线程在耗尽数据时退出。

您需要使用来等待进程完成

此外,您需要同时使用stdout和stderr,以避免阻塞和可能的进程挂起。因此,您需要两个线程来读取这些流,并在流可用时继续读取


有关使用标准输出/err的更多信息和
StreamGobbler
实现,请参阅。

您需要在单独的线程中读取输出,这里有一个示例(我是开发人员):

您需要的唯一依赖项是:

<dependency>
  <groupId>com.jcabi</groupId>
  <artifactId>jcabi-log</artifactId>
  <version>0.7.5</version>
</dependency>

com.jcabi
jcabi测井
0.7.5

我不想在发送此任务时挂起主进程;这就是为什么我在一个线程中这样做。你是说我需要多个线程来处理这个任务吗?如果你试图使用stout然后是stderr,或者stderr然后是stdout(即不并发),那么你可能会遇到阻塞行为,这取决于输出的数量。因此,不管在新线程中生成进程,您都需要在单独的线程中使用stdout/err。
<dependency>
  <groupId>com.jcabi</groupId>
  <artifactId>jcabi-log</artifactId>
  <version>0.7.5</version>
</dependency>