Java Process.waitFor() 和 IO 流

标签 java runtime subprocess stdio

我有以下代码;

String[] cmd = { "bash", "-c", "~/path/to/script.sh" };
Process p = Runtime.getRuntime().exec(cmd);

PipeThread a = new PipeThread(p.getInputStream(), System.out);
PipeThread b = new PipeThread(p.getErrorStream(), System.err);

p.waitFor();

a.die();
b.die();

PipeThread 类非常简单,因此我将完整地包含它;

public class PipeThread implements Runnable {

    private BufferedInputStream in;
    private BufferedOutputStream out;

    public Thread thread;

    private boolean die = false;

    public PipeThread(InputStream i, OutputStream o) {
        in = new BufferedInputStream(i);
        out = new BufferedOutputStream(o);
        thread = new Thread(this);
        thread.start();
    }

    public void die() { die = true; }

    public void run() {
        try {
            byte[] b = new byte[1024];
            while(!die) {
                int x = in.read(b, 0, 1024);
                if(x > 0) out.write(b, 0, x);
                else die();
                out.flush();
            }
        }
        catch(Exception e) { e.printStackTrace(); }

        try { 
            in.close();
            out.close();
        }
        catch(Exception e) { }
    }
}

我的问题是这样的; p.waitFor() 会无限阻塞,即使在子进程终止之后也是如此。如果我创建一对PipeThread实例,那么p.waitFor()可以正常工作。 io 流的管道是什么导致 p.waitFor() 继续阻塞?

我很困惑,因为我认为 IO 流是被动的,无法使进程保持 Activity 状态,或者使 Java 认为进程仍然 Activity 。

最佳答案

在您的PipeThread代码中,您将永远循环直到!die - 但您在p.waitFor()之后调用PipeThread.die() - 究竟是什么停止了 PipeThread 线程?

关于Java Process.waitFor() 和 IO 流,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13359391/

相关文章:

python - 在单独的线程中从 python 启动 csh 脚本

python - 使用 python 子进程运行 shell 命令

python - 使用python中的subprocess模块​​通过命令行输入运行lua脚本

java - hibernate-core 和 hibernate-annotation - 冲突

java - 如何使用 POI 从 excel 导出嵌入式文件?

Java Regex - 正则表达式

c# - 系统参数异常 : 'The path must be absolute. (Parameter ' root')'

java - Exec() 未正确解释多个命令

java - 如何在接听电话时开始视频(在 Activity 内)并在通话结束时停止 Activity ?

java - 算法运行时间分析