3

調査した結果、Java の ProcessBuilder を使用する「正しい」方法は、他の 2 つのスレッドを生成して、新しく作成されたプロセスの stdout/stderr を処理し、次のようにハングしないようにすることであることに 気付きました。

しかし、これは私に2つの質問について疑問に思いました.

2.) さらに、両方のストリームを stdout にリダイレクトする場合、親プロセスが stdout ストリームを飲み込むだけで、デッドロックを心配する必要がなくなりますか?

4

1 に答える 1

3

条件に注意してください。スレッドはプロセスではありません

  1. 子は両方に書き込むことができ、バッファstderrがいっぱいになるとデッドロックが発生するためです (子は親が読み取るstderrのを待機し、親は子が閉じるのを待機しますstdout)。

  2. いいえ。子プロセスにも が必要な場合は、メイン スレッドでstdin処理stdinし、追加のスレッドを介してマージされた出力ストリームを読み取る必要があります。そうしないと、再びデッドロックが発生する可能性があります (子は親が出力ストリームを読み取るのを待機し、親は子を待機します)上のデータを読み取るstdin)。

于 2010-06-16T15:18:44.683 に答える