Javaにはfork()はありませんが、新しいプロセス(Processクラスのオブジェクト)を開始するためのProcessBuilderとRuntime.exec()があります。fork()/ exec()のペアと考えることができますが、dup2()のようにその間に何かを実行する機能はありません。つまり、子プロセスのstdioをリダイレクトすることはできませんが、対応するProcessメソッド、正確には、入出力ストリームの対応するメソッドを使用して、stdinに明示的に書き込み、stdoutとstderrから読み取ることができます。 ProcessクラスのgetInputStream()/ getOutputStream()/ getErrorStream()メソッドによって返されます。スレッドの代わりにプロセスが必要な場合、これは有効な回避策になる可能性があります。
スレッドを使用する場合は、すべて同じstdioを共有します。リダイレクトすることはできますが、リダイレクトはすべてのスレッドに影響するため、意味がありません。カスタムInputStream/OutputStream実装を使用して、スレッドでIPCのある種の模倣を使用できます。または、PipedInputStream/PipedOutputStreamのペアを確認することもできます。これらは実際にIPCパイプのようなものをセットアップするために使用でき、おそらく過度のブロッキングを回避するためにBufferedInputStream/BufferedOutputStreamと組み合わせて使用できます。