我有以下代码;

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()可以完美地工作。导致p.waitFor()继续阻塞的io流管道是什么?

我感到困惑,因为我认为IO流将是被动的,无法使进程保持活动状态,或者使Java认为该进程仍然处于活动状态。

最佳答案

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

10-06 02:03