調査した結果、Java の ProcessBuilder を使用する「正しい」方法は、他の 2 つのスレッドを生成して、新しく作成されたプロセスの stdout/stderr を処理し、次のようにハングしないようにすることであることに 気付きました。
しかし、これは私に2つの質問について疑問に思いました.
2.) さらに、両方のストリームを stdout にリダイレクトする場合、親プロセスが stdout ストリームを飲み込むだけで、デッドロックを心配する必要がなくなりますか?
調査した結果、Java の ProcessBuilder を使用する「正しい」方法は、他の 2 つのスレッドを生成して、新しく作成されたプロセスの stdout/stderr を処理し、次のようにハングしないようにすることであることに 気付きました。
しかし、これは私に2つの質問について疑問に思いました.
2.) さらに、両方のストリームを stdout にリダイレクトする場合、親プロセスが stdout ストリームを飲み込むだけで、デッドロックを心配する必要がなくなりますか?
条件に注意してください。スレッドはプロセスではありません。
子は両方に書き込むことができ、バッファstderr
がいっぱいになるとデッドロックが発生するためです (子は親が読み取るstderr
のを待機し、親は子が閉じるのを待機しますstdout
)。
いいえ。子プロセスにも が必要な場合は、メイン スレッドでstdin
処理stdin
し、追加のスレッドを介してマージされた出力ストリームを読み取る必要があります。そうしないと、再びデッドロックが発生する可能性があります (子は親が出力ストリームを読み取るのを待機し、親は子を待機します)上のデータを読み取るstdin
)。