私は次のコードを持っています。
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()
サブプロセスが終了した後でも、無限にブロックします。インスタンスのペアを作成しない場合は、完全に機能します。ブロックを継続する原因となっているioストリームの配管についてはどうですか?PipeThread
p.waitFor()
p.waitFor()
IOストリームがパッシブであるか、プロセスを存続させることができないか、またはJavaにプロセスがまだ存続していると思わせることができないと思ったので、私は混乱しています。