8

プロセスの出力ストリームとエラーストリームから読み取り、それらを1つのテキストストリームにマージしたいと思います。私のプログラムはGroovyで、次のようになります。

def mergeStream = new ByteArrayOutputStream()
process.waitForProcessOutput(mergeStream, mergeStream)

問題は、ByteArrayOutputStreamがスレッドセーフではなく、waitForProcessOutput()がmergeStreamに追加する2つのスレッドを生成することです。使用できるスレッドセーフなバリアントはありますか?mergeStreamへのアクセスを制御することを他にどのように推奨しますか?実際には、この実装では文字が削除されることがあるようです。

4

1 に答える 1

7

process.waitForProcessOutput()がas引数を取る場合は、すべてのメソッドが同期OutputStreamされたカスタム実装を使用しOutputStreamて、ラップされたの対応するメソッドに委任することができByteArrayOutputStreamます。Collections.synchronizedList()別のリストを同期されたリストプロキシにラップするのと同じです。

編集:

とは言うものの、ByteArrayOutputStreamのソースを読み取ると、そのすべてのメソッドはすでに同期されているため、すでにスレッドセーフです。あなたのバグはおそらく他の場所から来ています。

于 2012-10-31T21:50:09.137 に答える