私はProcessBuilderを 'ls'コマンドと同じように簡単に使用しようとしています。私はすでにwaitFor()呼び出しが戻る前に消費される必要のあるプロセスストリームに関する問題を読んでいますが、出力にリダイレクトされたエラーでもストリームを完了しても、プロセスは返されません。ProcessBuilder waitFor()never returns
public class ProcessTest {
public static void main(String[] args) throws Exception {
ProcessBuilder builder = new ProcessBuilder();
builder.command("ls");
builder.redirectErrorStream(true);
Process process = builder.start();
StreamGobbler streamGobbler = new StreamGobbler(process.getInputStream(), System.out::println);
Executors.newSingleThreadExecutor().submit(streamGobbler);
int exitCode = process.waitFor();
}
}
StreamGlobberはナイーブconsummer beeingてと:
public class StreamGobbler implements Runnable {
private InputStream inputStream;
private Consumer<String> consumer;
public StreamGobbler(InputStream inputStream, Consumer<String> consumer) {
this.inputStream = inputStream;
this.consumer = consumer;
}
@Override
public void run() {
new BufferedReader(new InputStreamReader(inputStream)).lines().forEach(consumer);
}
}
を誰かが私が間違ってここに行くよ何私を見ることができますか?
waitFor()の後にシャットダウン**を追加すると、プロセスは以前には終了しなかった場所に終了します。 – iheanyi
ノートパソコンをシャットダウンしている間に間違いが見つかりました。それはもちろんでした。ありがとう –
@ iheanyi:終了していないプロセスではなく、終了していないExecutorServiceによって使用されているスレッドです。 –