2012-10-31 6 views
8

私は、プロセスの出力とエラーストリームから読み込み、それらを1つのテキストストリームにマージしたいと思っています。私のプログラムは、グルーヴィーであり、このように読み取りますスレッドセーフなByteArrayOutputStreamとは何ですか?

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

問題はByteArrayOutputStreamが安全とwaitForProcessOutputスレッドされていないということです()mergeStreamに追加二つのスレッドを生成します。私が使用できるスレッドセーフなバリアントはありますか?どうすればmergeStreamへのアクセスを制御することをお勧めしますか?実際には、この実装では文字が破棄されることがあります。

+2

ProcessBuilderのredirectErrorStreamについて考えましたか? – artbristol

+0

はい、*スレッドセーフです。あるいは、そのすべてのメソッドが同期されています。そして、 'ProcessBuilder.redirectErrorStream()'は質問全体を冗長にします。本当の質問ではありません。 – EJP

+1

@EJP - あなたが答えを知っているならば、それは本当の質問ではありません。そうでなければ、それは素晴らしい質問です! javadocは同期については何も言わない - AFAICT、あなたはそれを見つけるためにソースを掘り下げなければならず、あなたはコメントしていないので、困ったことはないだろう(スレッドセーフではないと仮定した。 –

答えて

7

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

EDIT:

ByteArrayOutputStreamのソースを読んで、言った、そのすべての方法が既に同期、それはすでにスレッドセーフですされています。あなたのバグはおそらく他の場所から来ています。

関連する問題