2017-09-20 12 views
0

私は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); 
    } 
} 

を誰かが私が間違ってここに行くよ何私を見ることができますか?

答えて

0

問題は外部プロセスの処理ではなく、Executors.newSingleThreadExecutor()によって返されたExecutorServiceの間違った使用です。このメソッドは、バックグラウンドで実行中のスレッドを作成します。このexecutorをシャットダウンすることはありません(スレッドを停止する)ので、このスレッドはJVMが終了するのを防ぎます。

場合は、lsプロセスが終了コードを出力する行を追加して終了することを証明できます。ただし、この行は出力の最下部に表示されないことがあります。

これに対処するには、作成したExecutorServiceへの参照を保持し、必要がなくなったらシャットダウンする必要があります。

 ExecutorService executor = Executors.newSingleThreadExecutor(); 
     executor.submit(streamGobbler); 

     int exitCode = process.waitFor(); 

     executor.shutdown(); 

 Executors.newSingleThreadExecutor().submit(streamGobbler); 

     int exitCode = process.waitFor(); 

を交換してみてください、私はあなたのコードにこの変更を行い、それがきれいに出て行くにぶら下がってから行ってきました。

+0

waitFor()の後にシャットダウン**を追加すると、プロセスは以前には終了しなかった場所に終了します。 – iheanyi

+0

ノートパソコンをシャットダウンしている間に間違いが見つかりました。それはもちろんでした。ありがとう –

+1

@ iheanyi:終了していないプロセスではなく、終了していないExecutorServiceによって使用されているスレッドです。 –